【问题标题】:WebSphere Liberty v16.0.0. 3 JAX-RS: QueryParams / PathParams mapping issueWebSphere Liberty v16.0.0。 3 JAX-RS:QueryParams / PathParams 映射问题
【发布时间】:2016-12-08 16:28:18
【问题描述】:

使用以下 REST 服务定义:

@GET
@Path("/selection/{typeAssignation}/{numeroEmploye}")
public Response obtenirChoixSecteurs(@PathParam("typeAssignation") String typeAssignation,
                                     @PathParam("numeroEmploye") Long numeroEmploye,
                                     @QueryParam("confirme") @DefaultValue("true") Boolean confirme) 

使用此 URL 调用服务时:

<...>/selection/HEBDOMADAIRE/206862?confirme=true

Liberty v16.0.0.3 抛出 NumberFormatException 并且客户端收到 HTTP 404 返回码:

java.lang.NumberFormatException: For input string: "206862?confirme=true"

liberty v16.0.0.3 似乎无法为正确的 PathParams / QueryParams 分配正确的值,即使它能够根据 URL 选择正确的方法 相同的代码在 WAS v8.5.5.9 中运行良好
这是嵌入 Liberty 的 cxf 中的错误(与 WAS 中的 wink 相比)吗?

【问题讨论】:

  • 我不建议在 url 中接收键入的值,我会将所有内容设置为字符串并在之后解析它。
  • 您是否有理由不建议使用标准 REST API?投了反对票,因为这根本不能解决我的问题......

标签: java jax-rs websphere websphere-liberty


【解决方案1】:

我怀疑 GET 请求在某种程度上搞砸了。当我使用您的方法签名构建 JAX-RS 资源时,一切都按预期工作。我可以重现 NumberFormatException 的唯一方法是在数字末尾放置一个非数字字符(如“<...>/selection/HEBDOMADAIRE/206862_?confirme=true”)。这让我觉得你的问号被转义了。

这是我使用的代码:

@GET
@Path("/selection/{typeAssignation}/{numeroEmploye}")
public Response obtenirChoixSecteurs(@PathParam("typeAssignation") String typeAssignation,
                                     @PathParam("numeroEmploye") Long numeroEmploye,
                                     @QueryParam("confirme") @DefaultValue("true") Boolean confirme) {

    String s =  "obtenirChoixSecteurs typeAssignation='" + typeAssignation + "' numeroEmploye=" + numeroEmploye + " confirme='" + confirme + "'";
    System.out.println(s);
    return Response.ok("success: " + s).build();
}

日志(和浏览器)中的输出是:

obtenirChoixSecteurs typeAssignation='HEBDOMADAIRE' numeroEmploye=206862 confirme='true'

我想知道使用 JAX-RS 客户端 API 调用服务是否会更幸运,例如:

    Client client = ClientBuilder.newClient();
    WebTarget target = client.target("http://localhost:9080/myApp/rest/res/selection/HEBDOMADAIRE/206862?confirme=true");
    System.out.println( target.request().get(String.class) );

测试客户端需要使用 JAX-RS 2.0 API,但我能够使用 Liberty 16.0.0.3 使用 jaxrs-1.1 和 jaxrs-2.0 功能获得成功的结果

其他一些想法:

  • 您是否在 Application getClasses() 方法中添加资源类?我认为 2.0 不需要这样做,但 1.1 可能需要这样做。
  • 您是否有任何其他提供程序、过滤器、拦截器等可能在使用该 URL?

希望这会有所帮助,安迪

【讨论】:

    【解决方案2】:

    @Andy,感谢您的指点
    在 WAS v8.5.5 中,客户端是这样的:

    org.apache.wink.client.Resource resource;
    resource = restClient.resource("<...>/selection/HEBDOMADAIRE/206862?confirme=true");
    

    在 WLP v16.0.0.3 中,客户端被转换为 JAX-RS 2.0,如下所示:

      WebTarget  webTargetAST = restClient.target(<...>);
      WebTarget wt = webTargetAST.path("/selection/HEBDOMADAIRE/206862?confirme=true");
    

    将其更改为以下使其工作

      WebTarget  webTargetAST = restClient.target(<...>);
      WebTarget wt = webTargetAST.path("/selection/HEBDOMADAIRE/206862");
      wt = wt.queryParam("confirme","true");
    

    似乎 WLP 中的 JAX-RS 对 "?" 进行了编码,而 WAS v8.5.5 中的 wink 没有,并且它在日志中不直接“可见”...
    再次感谢

    【讨论】:

    • 而不是添加您自己的“答案”来回应另一个问题,您应该将其添加为您的问题的更新,为安迪的答案添加评论,然后通过单击复选标记接受他的答案答案左侧。
    • 好的。但是安迪的回答不是我的问题的答案,我的问题的答案是我自己的答案..那么这里的“官方程序”是什么?更新后接受我自己的问题??
    • 抱歉,我误解了这个问题。是的,如果你的答案是“正确的”,而安迪刚刚指出你的方向是正确的,那么我相信你可以接受自己的答案。很高兴你发现了这个问题。
    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    相关资源
    最近更新 更多