Создание исключения WebapplicationException из одного веб-приложения и получение исключения UniformInterfaceException из другого - PullRequest
3 голосов
/ 03 августа 2011

Я вижу странную проблему.У меня есть два веб-приложения.Один для остальных веб-сервисов, которые мы раскрыли с помощью Джерси.Другой имеет реализацию JSF Front End, которая вызывает вышеупомянутый веб-сервис для получения деталей.Мы используем Tomcat в качестве контейнера.

Проблема, с которой я сталкиваюсь, заключается в том, что когда я вызываю веб-сервис отдыха, я выкидываю WebApplicationException, как это

catch (CustomExceptions e) {
    ResponseBuilder response = new ResponseBuilderImpl();
    response.status(500);
    response.entity(e.getStackTrace());
    throw new WebApplicationException(e, response.build()); 
}

А с другой стороны, в веб-приложениях FE я делаю следующее:*

try {
    r.get(MyClass.class);
    return "SUCCESS";
} catch (WebApplicationException wae) {
    return "FAILURE";
} catch (UniformInterfaceException wae) {
    return "FAILURE";
}

Здесь, в блоке catch, я ожидал исключение WebApplicationException, но оно выдает UniformInterfaceException, что странно.Также, если он генерирует UniformInterfaceException, он не поддерживает трассировку стека.Даже ответ, который я передал от вызова покоя, потерян.Может ли кто-нибудь помочь мне, как я могу получить оригинальную трассировку стека от остального вызова?

Заранее спасибо.

Ответы [ 2 ]

6 голосов
/ 15 сентября 2011

Как указано в руководстве пользователя и документации API , UniformInterfaceException является ожидаемым результатом, когда вы пытаетесь получить конкретную сущность по типу, но получаете не 200-серийный ответ.WebApplicationException - это удобное исключение для использования на стороне сервера для встраивания пользовательских ответов в исключение.

Ничто не "потеряно".Имейте в виду, что вы делаете HTTP-запрос здесь.Если вы хотите проверить код состояния и ответить самостоятельно, используйте

ClientResponse response = r.get(ClientResponse.class);
if (response.getStatus() == <expected status code>) [
    response.getEntity(MyClass.class);
    // do happy path stuff
} else {
    // bad stuff here
}

В качестве альтернативы, предположите, что все будет хорошо, и проверяйте ответ только на исключениях:

try {
    r.get(MyClass.class);
} catch (UniformInterfaceException e) {
    ClientResponse response = e.getResponse();
    // do whatever with the raw response
}
0 голосов
/ 15 сентября 2011

У меня была такая же проблема раньше. Я думаю, это потому, что метод Джерси WebResource.get выбрасывает только UniformInterfaceException, что не входит в иерархию наследования WebApplicationExcpetion. Что я сделал, так это оставил api на стороне клиента на Джерси, но использовал простой ApacheHttpClient. Смогут получить правильную трассировку стека в содержимом httpResponse.

Надеюсь, это поможет.


Спасибо, Райан. Я попробовал ваше решение. Очень мило.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...