当前位置: 首页 > 知识库问答 >
问题:

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

常俊爽
2023-03-14

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

@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>

一切正常。一个获取http://localhost:8080/rest/my service/123的调用调用getById,一个获取http://localhost:8080/rest/my service?param1=123调用getAll

场景 B:

如果使用 /rest 和 Web 的应用程序上下文部署服务.xml则映射为

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

呼叫GEThttp://localhost:8080/rest/myservice/123仍然调用getById,但调用GEThttp://localhost:8080/rest/myservice?param1=123还调用getById,Jersey在NumberFormatException上崩溃(它认为/myservice实际上是方法的第一个参数,id是Long)。

同样重要的是要提到GEThttp://localhost:8080/rest/myservice/(注意尾随斜杠)确实调用getAll,但我将无法发送参数。

我唯一能控制的是html" target="_blank">web.xml和应用上下文(但一定不能是/rest/myservice。它必须是通用的,并且与服务名无关)

有没有办法让方案 B 工作?

更新:添加了客户端代码

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

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

<code>获取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个答案

冯良才
2023-03-14

只是为了完整起见,http://localhost:8080/rest/myservice/?param1=123

'?'前的斜杠将请求关系上下文从 /myservice更改为/

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

 类似资料:
  • 问题内容: 可以做这样的事情吗? 我正在使用RESTEasy。 问题答案: 是的,您可以这样做,尽管您将必须重命名方法,以使它们的签名不同。 更新: 检查Dieter Cailliau的答案, 可能是您想要的… 您可以在其中检查JSR-311的API及其参考实现,名称为“ jersey”: JSR311 API 泽西岛

  • 我在尝试安装MAVEN时遇到了这个错误。我尝试了排除,但不确定在pom文件中包含的位置。让我在我的pom文件中应该包括怎样和什么排除标记。我还附加了我的pom文件片段,其中包括排除'SLF4J:Class path包含多个SLF4J绑定。 SLF4J:在[jar:file:/c:/users/147188/.m2/repository/ch/qos/logback/logback-classic/

  • 当尝试运行gradle构建时,我得到了这个错误 我理解这是一个版本冲突,但不确定如何解决,以及哪个版本 要排除的版本。。。 gradle依赖关系树是: 但我甚至不知道怎么读… 你能帮忙吗?

  • 问题内容: 好吧,我已经研究并没有找到以下问题的解决方法`’SQL Error (1442): Can not update table’ messages’ in stored function / trigger because it is already used by statement Which invoked this stored function / trigger.`` 我的触

  • 我的应用程序使用spring boot版本2.5.0和spring cloud starter netflix zuul 2.2.8。释放 在最新的spring boot版本2.5.0中,getErrorPath()API从ErrorController中删除,但最新的spring cloud starter netflix zuul 2.2.8。RELEASE仍调用此API并导致此错误 有人遇到

  • void trigger_error(string error_msg, [int level]) This function can be used to output an error message using Smarty. level parameter can be one of the values used for trigger_error() PHP function, i.e