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

Gle*_*eeb 15 rest spring jax-rs spring-mvc jersey

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

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

例如:

我有 Path("/myGET")

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

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

@GET  
@Produces(MediaType.APPLICATION_JSON)
@TypeHint(TagSets.class)
public Response getTagSets(){
    ...
}
Run Code Online (Sandbox Code Playgroud)

现在我收到一个错误:

严重:已使用资源和/或提供程序类检测到以下错误和警告:严重:生成媒体类型冲突.资源方法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个函数并检查参数并调用我需要的东西(这是我在发布问题之前使用的).但我正在寻找的可能是使用框架的力量来拯救我的麻烦

谢谢.

anv*_*rik 5

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

       ...

}
Run Code Online (Sandbox Code Playgroud)


小智 1

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

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