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

Java 如何在不同的资源中重用REST方法?,java,rest,jersey,jax-rs,Java,Rest,Jersey,Jax Rs,嗨 我正在使用Jersey和Java构建RESTAPI。我想知道是否有可能在许多资源中重用一个方法 例如,如果我有以下代码: @Path(“/users”) 公共类用户资源{ @得到 @路径(“/{uid}/comments”) @产生(MediaType.APPLICATION_JSON) 公共列表getComments(){ 返回commentService.getOnEntity(“用户”,uid); } } 这是: @Path(“/items”) 公共类ItemResource{

我正在使用Jersey和Java构建RESTAPI。我想知道是否有可能在许多资源中重用一个方法

例如,如果我有以下代码:

@Path(“/users”)
公共类用户资源{
@得到
@路径(“/{uid}/comments”)
@产生(MediaType.APPLICATION_JSON)
公共列表getComments(){
返回commentService.getOnEntity(“用户”,uid);
}   
}
这是:

@Path(“/items”)
公共类ItemResource{
@得到
@路径(“/{uid}/comments”)
@产生(MediaType.APPLICATION_JSON)
公共列表getComments(){
返回commentService.getOnEntity(“Item”,uid);
}   
}
是否可以重用代码来指定方法“/{uid}/comments/”,这样我就不需要在每个需要它的资源中编写它了

我想我可以用这个方法扩展CommentResource,但是我只能添加一组方法。如果我使用接口,我可以指定多个方法集,但必须在每个资源的方法内重写代码

编辑 在@thomas.mc.work的提示下,我使用一个子资源重写了代码。它比第一个解决方案要好,因为我从我的子资源中获得了所有方法,并且每个资源只需要4行代码。这就是它的样子:

@Path(“/users”)
公共类用户资源{
@路径(“/{uid}/comments”)
公共CommentSubResource getCommentSubResource(@PathParam(“uid”)字符串uid){
返回新的CommentSubResource(“用户”,uid);
}   
}
这是:

@Path(“/items”)
公共类ItemResource{
@路径(“/{uid}/comments”)
公共CommentSubResource getCommentSubResource(@PathParam(“uid”)字符串uid){
返回新的注释子资源(“项”,uid);
}   
}
这是:

公共类注释子资源{
私有字符串实体;
私有字符串entityUid;
公共CommentSubResource(字符串实体、字符串实体UID){
this.entity=实体;
this.entityUid=entityUid;
}
@得到
@路径(“/”)
@产生(MediaType.APPLICATION_JSON)
公共列表getComments(){
返回commentService.getOnEntity(entity,entityUid);
}
@删除
@路径(“/”)
@产生(MediaType.APPLICATION_JSON)
公共列表deleteComment(@PathParam(“uid”)字符串uid){
返回commentService.delete(uid);
}
}
这样好多了。我有一个想法,就是使用Java8和默认实现接口来实现一个接口以获得功能,但我不确定是否能够确定调用默认实现方法的资源

编辑

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

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

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

您可能可以通过一些通配符技巧来完成。究竟为什么要将实体名称作为
字符串
传递给
评论服务
?我更担心的是这个问题,而不是你的问题。你可以创建一个单独的资源来处理评论吗?该资源可以通过在路径中使用通配符来处理对注释的所有请求。e、 g.,/*/{uid}/comments.@Kayaman:我没有发送字符串作为实体值,只是为了简化我的示例@普里耶什:这将是一个非常好的解决方案,但我需要使用
/{entity}/{uid}/comments
来完成它,并且必须检查指定的实体是否假定具有注释功能,或者我是否弄错了?您可能可以使用一些通配符技巧来完成。究竟为什么要将实体名称作为
字符串
传递给
评论服务
?我更担心的是这个问题,而不是你的问题。你可以创建一个单独的资源来处理评论吗?该资源可以通过在路径中使用通配符来处理对注释的所有请求。e、 g.,/*/{uid}/comments.@Kayaman:我没有发送字符串作为实体值,只是为了简化我的示例@普里耶什:这将是一个非常好的解决方案,但我需要使用
/{entity}/{uid}/comments
来完成,并且必须检查指定的实体是否假定具有注释功能,或者我是否弄错了?我不知道如何在我的示例中使用它?如果我知道如何使用它,我就必须在两个子资源
ItemSubResource
UserSubResource
中添加一个方法
getComment()
,然后无论如何写两次该方法。我发现了如何使用子资源,用很少的代码将子资源的所有方法提供给父资源。但是我仍然需要编写将子资源提供给父资源的方法。我将尝试将它与使用Java8和默认实现接口结合起来。我可以创建自己的自定义注释来解决这个问题吗?我不知道如何在我的示例中使用它?如果我知道如何使用它,我就必须在两个子资源
ItemSubResource
UserSubResource
中添加一个方法
getComment()
,然后无论如何写两次该方法。我发现了如何使用子资源,用很少的代码将子资源的所有方法提供给父资源。但是我仍然需要编写将子资源提供给父资源的方法。我将尝试将它与使用Java8和默认实现接口结合起来。我可以创建自己的自定义注释来解决这个问题吗?