17

我想为同一个 GET 路径提供多个功能。

当且仅当查询参数与 URL 字符串中的参数匹配时,我希望我的 Web 服务“找到”这些函数。

例如:

我有Path("/myGET")

对于那条路,我想有两个功能:

@GET  
@Produces(MediaType.APPLICATION_JSON)
@TypeHint(TagSets.class)
public Response getTagSets(@QueryParam("entityId") Integer entityId)
{
    ...
}

@GET  
@Produces(MediaType.APPLICATION_JSON)
@TypeHint(TagSets.class)
public Response getTagSets(){
    ...
}

现在我收到一个错误:

严重:在资源和/或提供程序类中检测到以下错误和警告:严重:产生媒体类型冲突。资源方法 public javax.ws.rs.core.Response<...>.getTagSets(java.lang.Integer) 和 public javax.ws.rs.core.Response<...>.getTagSets(java.lang. Integer,java.lang.Integer) 可以产生相同的媒体类型 SEVERE:产生媒体类型冲突。资源方法 public javax.ws.rs.core.Response<...>.getTagSets() 和 public javax.ws.rs.core.Response <...>.getTagSets(java.lang.Integer,java.lang .Integer) 可以产生相同的媒体类型

所以首先:有什么方法可以实现我想要在这里做的事情..

第二:如果可用,当且仅当查询参数与函数中请求的内容完全匹配时,是否有任何方法可以找到路径?例如,如果将调用相同的路径,@QueryParam("differentParam")它将不会到达 2 个函数中的任何一个。

第三:如果没有办法用泽西岛做到这一点,有没有办法用任何其他框架来做到这一点?

重要提示:回答问题的人认为我正在寻找解决方法而不是解决方案。今天我正在使用 1 个函数并检查参数并从中调用我需要的东西(这是我在发布问题之前使用的)。但我正在寻找的可能是使用框架功能来为我省去麻烦

谢谢。

4

2 回答 2

5

资源由其路径唯一定义,而不是由其参数定义。您定义的两个资源具有相同的路径。您可以为它们中的每一个定义新路径,例如/myGet/entity, /myGet/, /myGet/differentParam; 或使用单个路径/myGet/并检查查询参数,如下所示:

@GET  
@Produces(MediaType.APPLICATION_JSON)
@TypeHint(TagSets.class)
public Response getTagSets(@Context HttpServletRequest request){

       ...

       if (request.getParameterMap().isEmpty()) {
           // then you have no query params, implement as there are no query params
       } else {
           String queryParam = request.getQueryString();
           // check queryParam, and add another if else statements, implement
       }

       ...

}
于 2013-08-27T13:53:44.360 回答
1

唯一的方法如评论中所述。您可以使用一个方法来声明所有查询参数,然后根据值(存在与否)调用正确的方法。

(解决方法)如果您只想向客户端公开具有多个查询参数的单个端点并且代码实现无关紧要,您可以使用拦截器。读取查询参数并修改 URI 以将其定向到正确的方法。

于 2013-08-27T13:15:55.277 回答