Javax.xml.ws.soap.SOAPFaultException: ошибка демаршаллинга: неожиданный элемент (uri:"", local:"fault") после миграции иJAVA

Программисты JAVA общаются здесь
Anonymous
Javax.xml.ws.soap.SOAPFaultException: ошибка демаршаллинга: неожиданный элемент (uri:"", local:"fault") после миграции и

Сообщение Anonymous »

Проблема

Я пытаюсь перенести клиент моего веб-сервиса с Apache AXIS-1 на Apache CXF. Сам веб-сервис работает на AXIS-1 и находится вне моего контроля.

Я сгенерировал все артефакты CXF, и клиент работал хорошо, пока служба не выявила какую-либо ошибку. Неисправный XML выглядит так:

Код: Выделить всё




soapenv:Server
Remote error processing component card request


:-303
Remote error processing component card request
remote_service


-303
Remote error processing component card request









Это приводит к исключению клиента, созданного CXF:

Код: Выделить всё

javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"fault").
Expected elements are ,,
...

at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:603)
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:244)
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:239)
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:116)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1009)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:446)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:427)
at com.sun.xml.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:71)
at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:137)
at com.sun.xml.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:240)
at com.sun.xml.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:123)
...
AFAIU из этой трассировки стека, unmarshaller ожидает, что элемент fault будет иметь определенное объявление пространства имен, но он не имеет его.

Может ли кто-нибудь подсказать, что не так с этим клиентом и как избежать ошибки?

Проверенные решения

Подобных вопросов много, но не все решения применимы для меня, потому что я не могу ничего изменить на стороне сервера (по крайней мере, по соображениям обратной совместимости), а изменение WSDL также не приветствуется. Таким образом, изменения ограничены только на стороне клиента (включая его (пере)генерацию).
Я попробовал несколько возможных решений, основанных на схожих вопросах:
  • добавление package-info.class с объявлением пространства имен по умолчанию - ничего не меняется;
  • принудительно установить пустое пространство имен для сгенерированных классов Fault и/или Fault_Exception - NullPointerException в подпрограммах CXF во время создания объекта исключения (см. раздел «РЕДАКТИРОВАНИЕ» ниже);
  • с использованием SAX XmlFilter — не удалось найти способ встроить его в подпрограммы, сгенерированные CXF.
Дополнительная информация

Сгенерированные CXF классы для исключений и их FaultInfo (без каких-либо моих изменений) выглядит так:

Класс Fault:

Код: Выделить всё

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"faultcode",
"faultstring",
"faultactor",
"detail"
})
@XmlRootElement(name = "fault")
public class Fault {

@XmlElement(required = true)
protected String faultcode;
...
Fault_Exception класс:

Код: Выделить всё

@WebFault(name = "fault", targetNamespace = "http://some.namespace.org")
public class Fault_Exception extends Exception {

private Fault fault;

public Fault_Exception() {
super();
}
...
Некоторые выдержки из WSDL.
Объявление сообщения WSDL Fault:
Ошибка XSD элемент:

Код: Выделить всё


Comment describing your root element



...
...
...
...



Описание операции WSDL Пример:
Корневой элемент WSDL:
Можно предоставить дополнительную информацию.

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

РЕДАКТИРОВАТЬ:

В ходе «расследования» я обнаружил, что NullPointerException (о котором я упоминал в «Проверенных решениях») не является следствием моих ошибочных действий. Это ошибка CXF:
Оба билета закрыты с разрешением «Исправлено», но в комментариях пользователи сообщают, что все еще обнаруживают эту ошибку. Похоже, разработчики не предусмотрели все случаи, когда пользовательские исключения обрабатываются CXF, и по каким-то причинам это иногда приводит к


org.apache.cxf.interceptor.ClientFaultConverterprocessFaultDetail

ИНФОРМАЦИЯ: При создании исключения произошло исключение: null

java.lang.NullPointerException


Кто-нибудь тоже сталкивался с такой проблемой?

Вернуться в «JAVA»