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

时间:2015-10-14 12:59:38

标签: java rest jersey jax-rs

您好,

我正在使用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和默认的实现接口,只能实现接口以获取功能,但我不确定我是否能够确定调用默认实现方法的资源。

修改
经过一些实验,我认为子资源是可行的方法,即使它不是(根据我)的完美解决方案。

1 个答案:

答案 0 :(得分:0)

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