我有以下服务(我无法控制路径和注释)
@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)
答案 0 :(得分:0)
为了完整起见,http://localhost:8080/rest/myservice/?param1=123¶m2=456确实有效。 (谢谢@ JBNizet)
'?'之前的斜线将 requestRelativeContext 从/ myservice更改为/
更新:事实证明,这个问题不会在较新的Jersey版本中重现。版本2.25.1不受此影响。