WebSphere Liberty v16.0.0。 3 JAX-RS:QueryParams / PathParams映射问题

时间:2016-12-08 16:28:19

标签: java jax-rs websphere websphere-liberty

使用以下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"

似乎自由v16.0.0.3无法为正确的PathParams / QueryParams分配正确的值,即使它能够根据URL选择正确的方法 相同的代码在WAS v8.5.5.9中非常有效 这是嵌入Liberty的cxf中的错误(WAS中的vs wink)吗?

2 个答案:

答案 0 :(得分:3)

我怀疑GET请求以某种方式搞砸了。当我使用您的方法签名构建JAX-RS资源时,一切都按预期工作。我可以重现NumberFormatException的唯一方法是在数字的末尾加上一个非数字字符(例如&#34;&lt; ...&gt; / selection / HEBDOMADAIRE / 206862_?confirme = true&#34;)。这让我觉得你的问号正在逃脱或其他什么。

以下是我使用的代码:

$description_divs = $html->find('.description');
echo 'first div '.$description_divs[0]->plaintext.'<br><br>';
echo 'second div '.$description_divs[1]->plaintext.'<br><br>';
echo 'third div '.$description_divs[2]->plaintext.'<br><br>';

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

@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();
}

我想知道您是否有更多运气使用JAX-RS客户端API来调用服务,例如:

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

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

其他一些想法:

  • 您是否在Application getClasses()方法中添加了资源类?我不认为这对于2.0是必要的,但1.1可能是必需的。
  • 您是否有其他可能正在使用该网址的提供商,过滤器,拦截器等?

希望这有帮助,Andy

答案 1 :(得分: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中的眨眼则没有,并且它不直接&#34;可见&#34;在日志中...
再次感谢