多个JAX RS路径触发错误的方法

时间:2017-10-01 23:01:30

标签: java rest web-services jersey jax-rs

我有以下服务(我无法控制路径和注释)

@Path("/")
public class MyService { 

 @GET
 @Path("/{id}")
 @Produces(MediaType.APPLICATION_JSON)
 public void getById(@PathParam("id") final Long id) {...}

 @GET
 @Produces(MediaType.APPLICATION_JSON)
 public void getAll(@QueryParam("param1") Long param1
                   ,@QueryParam("param2") Long param2) {...}
}

情景A:

如果使用 / rest / myservice 的应用程序上下文部署服务,并且web.xml映射

<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

一切正常。 对GET http://localhost:8080/rest/myservice/123的调用会调用 getById ,并且对GET http://localhost:8080/rest/myservice?param1=123的调用会调用 getAll

情景B:

如果使用 / rest 的应用程序上下文部署服务,并且web.xml映射

<servlet-mapping>
     <servlet-name>MyServlet</servlet-name>
     <url-pattern>/myservice/*</url-pattern>
 </servlet-mapping>

对GET http://localhost:8080/rest/myservice/123的调用仍会调用 getById 但是对GET http://localhost:8080/rest/myservice?param1=123的调用也会调用 getById 并且Jersey会在NumberFormatException上崩溃(它认为/ myservice实际上是方法的第一个参数, id 是Long)。

提及GET http://localhost:8080/rest/myservice/(注意尾部斜杠)确实调用 getAll 也很重要,但是我无法发送参数。

我唯一能控制的是web.xml和应用程序上下文(但它不能是 / rest / myservice 。它必须是通用的,与服务名称无关)< / p>

有没有办法让Scenario B工作?

更新:添加了客户端代码

来自Restlet客户端的简单休息调用:

GET http://localhost:8080/rest/myservice/123 - 200 OK

GET http://localhost:8080/rest/myservice?param1=123会导致异常

org.glassfish.jersey.server.internal.inject.ExtractorException: java.lang.NumberFormatException: For input string: "myservice"
    at org.glassfish.jersey.server.internal.inject.ParamConverters$AbstractStringReader.fromString(ParamConverters.java:90)
    at org.glassfish.jersey.server.internal.inject.AbstractParamValueExtractor.convert(AbstractParamValueExtractor.java:138)
    at org.glassfish.jersey.server.internal.inject.AbstractParamValueExtractor.fromString(AbstractParamValueExtractor.java:129)
    at org.glassfish.jersey.server.internal.inject.SingleValueExtractor.extract(SingleValueExtractor.java:83)
    at org.glassfish.jersey.server.internal.inject.PathParamValueFactoryProvider$PathParamValueFactory.provide(PathParamValueFactoryProvider.java:92)
    at org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:81)
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$AbstractMethodParamInvoker.getParamValues(JavaResourceMethodDispatcherProvider.java:121)
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$VoidOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:136)

1 个答案:

答案 0 :(得分:0)

为了完整起见,http://localhost:8080/rest/myservice/?param1=123&param2=456确实有效。 (谢谢@ JBNizet

'?'之前的斜线将 requestRelativeContext 从/ myservice更改为/

更新:事实证明,这个问题不会在较新的Jersey版本中重现。版本2.25.1不受此影响。