JAVA |CXF |JAX-RS |Обработка исключений - PullRequest
2 голосов
/ 13 марта 2012

Мы используем cxf версии 2.5.2 и выставляем и используем несколько успокоительных веб-сервисов, используя cxf jaxrs.

Есть идеи, как генерировать исключения от сервера к клиенту? Я попытался определить пользовательский сопоставитель исключений, реализовав интерфейс ExceptionMapper (метод toResponse) и добавил bean-компонент в cxf jaxrs: список поставщиков серверов.

Клиентская часть: Реализован ResponseExceptionMapper (метод fromResonse) и добавлен bean-компонент в cxf jaxrs: список поставщиков клиентов. Но это не похоже на работу.

Исключение - это пользовательское исключение, расширяющее java.lang.Exception. Получил "IllegalAnnotationsException 2 подсчета IllegalAnnotationExceptions StackTraceElement не имеет конструктора по умолчанию без аргументов"

Найдено http://java.net/jira/browse/JAXB-814 и обновление до jaxb-impl 2.2.5 решило эту проблему.

Но в конце я поражен следующим исключением на стороне сервера (во время вызова клиента):

org.apache.cxf.jaxrs.provider.AbstractJAXBProvider :
com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions blueprints.common.util.BlueprintsException does not have a no-arg default constructor"

и на стороне клиента:

JAXBException occurred : 1 counts of IllegalAnnotationExceptions. 
java.lang.ClassCastException: org.apache.cxf.helpers.LoadingByteArrayOutputStream$1 cannot be cast to  myExceptionClass:java.lang.ClassCastException" when i typecast Response.getEntity()) tp myExceptionClass in fromResponse (jaxrs provider that implements ResponseExceptionMapper) 

Кто-нибудь еще сталкивался с подобными проблемами? Нужно ли добавлять нестандартные перехватчики? Документ cxf не предоставляет пример для обработки исключений с использованием Spring config.

Редактировать на основе комментария Джигара: После добавления конструктора по умолчанию сущность в ответе содержит

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<blueprintsServiceException>
<stackTrace/>
<stackTrace/>
<stackTr‌​ace/>
<stackTrace/>
...
</blueprintsServiceException>` 

и я все еще получаю java.lang.ClassCastException:

org.apache.cxf.helpers.LoadingByteArrayOutputStream$1 cannot be cast to blueprints.server.exception.BlueprintsServiceException' when i typecast Response.getEntity()) to myExceptionClass in fromResponse 
(jaxrs provider that implements ResponseExceptionMapper) 

Спасибо
Гаятри

1 Ответ

0 голосов
/ 13 марта 2012

в BlueprintsException вам нужно предоставить конструктор по умолчанию,

Возможно, вы перегружены конструктором, который скрывает конструктор по умолчанию, поэтому вам нужно явно предоставить конструктор по умолчанию

...