2016-12-08 14 views
1

следующее определение REST службы:WebSphere Liberty v16.0.0. 3 JAX-RS: QueryParams/PathParams отображение выпуск

@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 не в состоянии ASSIG n правильные значения вправо PathParams/QueryParams, даже если он может выбрать правильный метод на основе URL-адреса Тот же код отлично работает в WAS v8.5.5.9
Это ошибка в cxf, встроенная в Liberty (vs wink в WAS)?

+0

Я бы не рекомендовал получать введенные значения в URL-адресе, я бы установил все как строку и проанализировал ее после. – Galeixo

+0

Есть ли причина, по которой вы рекомендуете не использовать стандартный REST API? Downvoted, потому что это не отвечает на мою проблему вообще ... – titou10

ответ

2

@Andy, спасибо за указатель
В БЫЛО 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"); 

Кажется, что JAX-RS в WLP закодировал "?" в то время как подмигнуть в БЫЛА v8.5.5 не и его не был непосредственно «видимым» в журналах ...
Еще раз спасибо

+0

Вместо того, чтобы добавлять свой «ответ» в ответ на другой, вы должны добавить это как обновление к своему вопросу, добавить комментарий к ответу Энди, а затем принять его ответ нажав галочку слева от ответа. –

+0

ОК. но ответ Энди не является ответом на мою проблему. Ответ на мою проблему - это мой собственный ответ. Так что же такое «официальная процедура» здесь? Примите мой вопрос после обновления? – titou10

+0

Приносим извинения, я неверно истолковал эту проблему. Да, если ваш ответ «правильный», в то время как Энди просто указал ваш в правильном направлении, тогда я считаю, что вы можете принять свой собственный ответ. Я рад, что вы поняли эту проблему. –

3

Я подозреваю, что запрос 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, но я был в состоянии чтобы получить успешный результат с обеих jaxrs-1.1 и jaxrs-2.0 с использованием функциями Liberty 16.0.0.3

Несколько других мыслей:

  • Вы добавляете класс ресурсов в вас getClasses Применения метода()? Я не думаю, что это необходимо с 2.0, но может потребоваться для 1.1.
  • Есть ли у вас какие-либо другие провайдеры, фильтры, перехватчики и т. Д., Которые могут воспроизводиться с помощью URL-адреса?

Надеется, что это помогает, Энди