【问题标题】:JAX-RS refactor sub-resource into separate Resource class?JAX-RS 将子资源重构为单独的资源类?
【发布时间】:2012-01-31 01:34:48
【问题描述】:

可以将具有子资源的 JAX-RS (Jersey) 资源类拆分为两个类吗?

目前,我将两者合并为一个资源类:

@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();   

        }  
}

代码编译时,资源路由不起作用。

【问题讨论】:

    标签: jersey jax-rs


    【解决方案1】:

    如果要在单独的类中处理子资源,则必须省略主资源类中方法的请求方法指示符。

    尝试为您的受信任会话创建一个子类。在主资源类中返回此类的实例,如下所示:

    @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();
        }
    }
    

    The Java EE 6 Tutorial 中(简要)解释了子资源定位器。

    顺便说一句:使用 javax.ws.rs.core.UriBuilder 可以更方便、更安全地构建 URI,即使用它的方法 fromResource(Class)。

    【讨论】:

    • UriBuilder#fromResource(Class) 的问题在于它仅适用于 root 资源。在上面的例子中,如果你在TrustedSession#createTrustedSession() 中使用了UriBuilder.fromResource(this.getClass()),它会抛出一个IllegalStateException。我还没有找到一个优雅的解决方案。
    • 我找到了一种方法,即使从子资源中也能正常工作。发布答案here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2015-05-05
    相关资源
    最近更新 更多