我正在使用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不(據我)的完美解決方案。
你可以用一些通配符來做。爲什麼你將一個實體名稱作爲'String'傳遞給你的'CommentService'?我會更擔心這一點,而不是你的問題。 – Kayaman
你可以創建一個單獨的資源來處理註釋嗎?所有請求註釋都可以通過在路徑中使用通配符來處理該資源。例如/ */{uid}/comments。 – Priyesh
@Kayaman:我沒有發送字符串作爲實體值,它只是爲了簡化我的示例。 @Priyesh:這將是一個很好的解決方案,但我需要使用'/ {entity}/{uid}/comments'來完成,並且必須檢查指定的實體是否具有評論功能,或者我弄錯了嗎? –