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

标签 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。它必须是通用的并且与服务名称无关)

有什么办法可以让场景 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&param2=456 确实有效。 (感谢@JBNizet)

“?”之前的斜杠将 requestRelativeContext 从/myservice 更改为/

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

关于java - 多个 JAX RS 路径触发错误的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46517700/

相关文章:

c# - 使用 C# 和基本身份验证使用 Web 服务

web-services - 错误 :Cannot compile Groovy files: no Groovy library is defined for module "myprojectname"

java - HashMap 的元素顺序错误

python - 基于用户角色以 REST 方式路由 API

java - n x n 整数矩阵求最大和的动态规划算法

ruby-on-rails - 哪个浏览器完全支持REST。是指获取、发布、放置和删除方法?

python - 为什么用于内容更新的 Github API 会抛出 400 错误?

c# - 处理 C# WebService 异常

java - 将数组从一种方法返回到另一种方法

java - 我可以仅 Autowiring 构造函数注入(inject)的多个参数之一吗?