如何在不同资源中重用 REST 方法?

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 和默认实现接口的想法,以便能够仅实现一个接口来获取功能,但我不确定我是否能够确定从哪个资源调用默认实现的方法。

编辑
经过一番努力,我认为子资源是可行的方法,即使它不是(根据我的看法)完美的解决方案。

有一个类似的功能叫做 "Subresource Locators"。您可以在运行时决定选择哪个资源来处理与您的 JAX-RS 方法匹配的请求。