您好,
我正在使用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和默认的实现接口,只能实现接口以获取功能,但我不确定我是否能够确定调用默认实现方法的资源。
修改
经过一些实验,我认为子资源是可行的方法,即使它不是(根据我)的完美解决方案。