2012-01-31 31 views
3

能否在JAX-RS(澤西)資源與子資源類可以分成兩個班?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(); 

     } 
} 

當代碼編譯時,資源路由不起作用。

回答

3

如果你要處理一個單獨的類子資源,你必須忽略請求方法指示符在主資源類中的方法。

嘗試創建一個子類您值得信賴的會話。返回這個類的一個實例,在主要資源類像這樣:

@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中解釋。

順便說一句:URI的可以更方便,更安全地建立與javax.ws.rs.core.UriBuilder,即其方法fromResource(類)。

+1

「UriBuilder#fromResource(Class)」的問題是它僅適用於**根資源**。在上面的例子中,如果你在'TrustedSession#createTrustedSession()'中使用了'UriBuilder.fromResource(this.getClass())',它會拋出'IllegalStateException'。我還沒有找到一個優雅的解決方案。 – curioustechizen 2012-12-13 06:54:56

+0

我找到一種方式來獲得這甚至從子資源工作。發表了答案[這裏](http://stackoverflow.com/a/13854924/570930)。 – curioustechizen 2012-12-13 07:22:01