Я пытаюсь перенести клиент моего веб-сервиса с 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
Это приводит к исключению клиента, созданного 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)
...
Может ли кто-нибудь подсказать, что не так с этим клиентом и как избежать ошибки?
Проверенные решения
Подобных вопросов много, но не все решения применимы для меня, потому что я не могу ничего изменить на стороне сервера (по крайней мере, из соображений обратной совместимости), а изменение WSDL также не приветствуется. Таким образом, изменения ограничены только на стороне клиента (включая его (пере)генерацию).
Я попробовал несколько возможных решений, основанных на похожих вопросах:
- добавление package-info.class с объявлением пространства имен по умолчанию – ничего не меняется;
- принудительно установить пустое пространство имен для сгенерированной Ошибки > и/или классы 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;
...
Код: Выделить всё
@WebFault(name = "fault", targetNamespace = "http://some.namespace.org")
public class Fault_Exception extends Exception {
private Fault fault;
public Fault_Exception() {
super();
}
...
Объявление сообщения WSDL Fault:
Код: Выделить всё
Код: Выделить всё
Comment describing your root element
...
...
...
...
Код: Выделить всё
Код: Выделить всё
Заранее спасибо!
РЕДАКТИРОВАТЬ :
В ходе «расследования» я обнаружил, что NullPointerException (о котором я упоминал в «Протестированных решениях») не является следствием моего ошибочные действия. Это ошибка CXF:
Оба билета закрываются с резолюцией «Исправлено», но в комментариях пользователи сообщают, что они все еще обнаруживают эту ошибку. Похоже, разработчики не предусмотрели все случаи, когда пользовательские исключения обрабатываются CXF и по каким-то причинам это иногда приводит к
org.apache .cxf.interceptor.ClientFaultConverterprocessFaultDetail
ИНФОРМАЦИЯ: при создании исключения произошло исключение: null
java.lang.NullPointerException
Кто-нибудь тоже сталкивался с такой проблемой?
Подробнее здесь: https://stackoverflow.com/questions/262 ... -element-u