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

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

Сообщение Anonymous »

Проблема

Я пытаюсь перенести клиент моего веб-сервиса с Apache AXIS-1 на < strong>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_ExceptionNullPointerException в подпрограммах 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


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

Подробнее здесь: https://stackoverflow.com/questions/262 ... -element-u
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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