我有以下服务(并且我无法控制路径和注释)
@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。它必须是通用的并且与服务名称无关)
有什么办法可以让场景 B 发挥作用吗?
更新:添加了客户端代码
来自 ReSTLet 客户端的简单 Rest 调用:
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)
最佳答案
只是为了完整起见,http://localhost:8080/rest/myservice/?param1=123¶m2=456 确实有效。 (感谢@JBNizet)
“?”之前的斜杠将 requestRelativeContext 从/myservice 更改为/
更新:事实证明,此问题在较新的 Jersey 版本中不会重现。版本 2.25.1 不受此影响。
关于java - 多个 JAX RS 路径触发错误的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46517700/