[英]How to reuse a REST methods in different resources?
嗨,
我正在使用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} / comments /”的代碼,這樣我就不必在將需要它的每個資源中編寫它了?
我想我可以用該方法擴展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和默認實現接口來實現接口的功能,但是我不確定是否可以確定從哪個資源調用默認實現的方法。
編輯
經過一些努力之后,我認為子資源是必經之路,即使(根據我的觀點)這不是完美的解決方案。
有一個類似的功能稱為“子資源定位符” 。 您可以在運行時決定選擇哪個資源來處理與您的JAX-RS方法匹配的請求。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.