2015-10-14 61 views
1

嗨,如何在不同的資源中重用REST方法?

我正在使用Jersey和Java構建REST-API。我想知道是否有可能在許多資源中重用一種方法。

作爲一個例子,如果我有這樣的代碼:

@Path("/users") 
public class UserResource { 
    @GET 
    @Path("/{uid}/comments") 
    @Produces(MediaType.APPLICATION_JSON) 
    public List<Comment> getComments() { 
     return commentService.getOnEntity("User", uid); 
    } 
} 

和此:

@Path("/items") 
public class ItemResource { 
    @GET 
    @Path("/{uid}/comments") 
    @Produces(MediaType.APPLICATION_JSON) 
    public List<Comment> getComments() { 
     return commentService.getOnEntity("Item", uid); 
    } 
} 

是否有可能重新使用的代碼,用於指定方法 「/ {UID} /評論/」所以我不需要將它寫在每個需要它的資源中?

我想我可以用這個方法擴展CommentResource,但是我只能添加一組方法。如果我使用接口,我可以指定多個方法集合,但必須在每個資源中的方法內重寫代碼。

編輯 從@ thomas.mc.work提示後,我使用子資源重寫了我的代碼。它比第一種解決方案更好,因爲我從我的子資源獲取所有方法,並且每個資源只需要4行代碼。這是它的樣子:

@Path("/users") 
public class UserResource { 

    @Path("/{uid}/comments") 
    public CommentSubResource getCommentSubResource(@PathParam("uid") String uid) { 
     return new CommentSubResource("User", uid); 
    } 
} 

這:

@Path("/items") 
public class ItemResource { 

    @Path("/{uid}/comments") 
    public CommentSubResource getCommentSubResource(@PathParam("uid") String uid) { 
     return new CommentSubResource("Item", uid); 
    } 
} 

這:

public class CommentSubResource { 

    private String entity; 
    private String entityUid; 

    public CommentSubResource(String entity, String entityUid) { 
     this.entity = entity; 
     this.entityUid = entityUid; 
    } 

    @GET 
    @Path("/") 
    @Produces(MediaType.APPLICATION_JSON) 
    public List<Comment> getComments() { 
     return commentService.getOnEntity(entity, entityUid); 
    } 

    @DELETE 
    @Path("/") 
    @Produces(MediaType.APPLICATION_JSON) 
    public List<Comment> deleteComment(@PathParam("uid") String uid) { 
     return commentService.delete(uid); 
    } 
} 

這是好多了。我有一個想法,使用java 8和默認的實現接口,只能implmenet一個接口來獲得功能,但我不知道我是否能夠確定哪個資源默認實現的方法被調用。

編輯
一些laboration我覺得子資源後是要走的路,即使it's不(據我)的完美解決方案。

+1

你可以用一些通配符來做。爲什麼你將一個實體名稱作爲'String'傳遞給你的'CommentService'?我會更擔心這一點,而不是你的問題。 – Kayaman

+0

你可以創建一個單獨的資源來處理註釋嗎?所有請求註釋都可以通過在路徑中使用通配符來處理該資源。例如/ */{uid}/comments。 – Priyesh

+0

@Kayaman:我沒有發送字符串作爲實體值,它只是爲了簡化我的示例。 @Priyesh:這將是一個很好的解決方案,但我需要使用'/ {entity}/{uid}/comments'來完成,並且必須檢查指定的實體是否具有評論功能,或者我弄錯了嗎? –

回答

0

有一個類似的功能叫"Subresource Locators"。您可以在運行時決定選擇哪個資源來處理匹配您的JAX-RS方法的請求。

+0

我不明白我會怎樣在我的例子中使用它?如果我理解如何使用它,我將不得不在兩個子資源「ItemSubResource」和「UserSubResource」中添加一個方法'getComment()',然後再寫兩次方法。 –

+0

我發現瞭如何使用子資源以很少的代碼將子資源的所有方法提供給父資源。但我仍然必須編寫提供子資源給父資源的方法。我將嘗試將它與使用java 8和默認實現接口相結合。我可以創建自己的自定義註釋來解決這個問題嗎? –

相關問題