Подресурс рефакторинга JAX-RS в отдельный класс Resource? - PullRequest
3 голосов
/ 31 января 2012

Можно ли разделить класс ресурсов JAX-RS (Джерси) с подресурсом на два класса?

В настоящее время эти два класса объединены в один класс ресурсов:

@Path("/session")
public class SessionResource {

    @POST
    @Produces("application/xml")
    public Response createSession() {
        ...
        ResponseBuilder builder = Response.created(URI.create("/session/" + new Date().toString()));
        return builder.build();
    }

    @DELETE
    public Response destroySession() {
        ...
        ResponseBuilder builder = Response.noContent();
        return builder.build();        
    }

    // TrustedSession sub-resource

    @POST
    @Path("/trusted")
    @Produces("application/xml")
    public Response createTrustedSession() {
        ...
        ResponseBuilder builder = Response.created(URI.create("/session/" + new Date().toString()));
        return builder.build();
    }

    @DELETE
    @Path("/trusted")
    public Response destroyTrustedSession() {
        ...
        ResponseBuilder builder = Response.noContent();
        return builder.build();        
    }    


}

Я хотел бы переместить код TrustedSession в отдельный ресурс:

@Path("/session/trusted")
public class createSession {

        @POST
        @Produces("application/xml")
        public Response createTrustedSession() {
            ...
            ResponseBuilder builder = Response.created(URI.create("/session/trusted/" + new Date().toString()));
            return builder.build();

        }

        @DELETE
        public Response destroySession() {
            ...
            ResponseBuilder builder = Response.noContent();
            return builder.build();   

        }  
}

Пока код компилируется, маршрутизация ресурсов не работает.

1 Ответ

3 голосов
/ 03 июля 2012

Если вы хотите обработать подресурс в отдельном классе, вы должны опустить указатель метода запроса для метода в основном классе ресурса.

Попробуйте создать подкласс для вашего доверенного сеанса. Вернуть экземпляр этого класса в основной класс ресурсов следующим образом:

@Path("/session")
public class SessionResource {
    // Note that the request method designator is omitted.
    @Path("/trusted")
    public TrustedSession getTrustedSession() {
        return new TrustedSession();
    }    
}

В классе для подресурса вам просто нужно аннотировать методы запроса:

public class TrustedSession {
    @POST
    @Produces("application/xml")
    public Response createTrustedSession() {
        URI uri = URI.create("/session/trusted/" + new Date().toString());
        return Response.created(uri).build();
    }

    @DELETE
    public Response destroySession() {
        return Response.noContent().build();
    }
}

Локаторы подресурсов (кратко) описаны в Учебное пособие по Java EE 6 .

Кстати: URI могут быть построены более удобно и безопасно с помощью javax.ws.rs.core.UriBuilder, а именно с его методом fromResource (Class).

...