使用不同的@QueryParams重载路径函数

时间:2013-08-27 12:13:44

标签: spring rest spring-mvc jersey jax-rs

我想为同一个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)可以生成相同的媒体类型     严重:产生媒体类型冲突。资源方法public javax.ws.rs.core.Response< ...> .getTagSets()和public javax.ws.rs.core.Response< ...> .getTagSets(java.lang.Integer, java.lang.Integer)可以生成相同的媒体类型

首先: 有没有办法实现我想做的事情..

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

第三: 如果没有办法用泽西岛做任何其他框架工作吗?

重要: 回答这个问题的人认为我正在寻找一种解决方案而不是解决方案。今天我正在使用1个函数并检查参数并调用我需要的东西(这是我在发布问题之前使用的)。但我正在寻找的可能是使用框架的力量来拯救我的麻烦

感谢。

2 个答案:

答案 0 :(得分:4)

资源由其路径唯一定义,而不是由其参数定义。您定义的两个资源具有相同的路径。您可以为每个路径定义新路径,例如/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
       }

       ...

}

答案 1 :(得分:1)

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

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