Как решить SAXException: неверный элемент в
Я пытаюсь получить результаты от веб-службы следующим образом.
List result = new Vector();
LibrarySearchRequest request = new LibrarySearchRequest(queryString);
LibrarySearchServicePortTypeProxy proxy =
new LibrarySearchServicePortTypeProxy();
LibrarySearchServicePortType port = proxy.getLibrarySearchServicePortType();
LibrarySearchResponse response = port.process(request);
librarysearch.soft.Book[] books = response.getBooks();
Когда я делаю это, я получаю следующее исключение (stacktrace):
org.xml.sax.SAXException: Invalid element in librarysearch.soft.Book - book
at org.apache.axis.encoding.ser.BeanDeserializer.onStartChild(BeanDeserializer.java:258)
at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035)
at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165)
at org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:1141)
at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:236)
at org.apache.axis.message.RPCElement.getParams(RPCElement.java:384)
at org.apache.axis.client.Call.invoke(Call.java:2467)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at librarysearch.soft.LibrarySearchServiceSOAP11BindingStub.process(LibrarySearchServiceSOAP11BindingStub.java:180)
at softarch.portal.db.ws.WS_RegularDatabase.findRecords(WS_RegularDatabase.java:44)
at softarch.portal.db.test.TestWSRegularDatabase.main(TestWSRegularDatabase.java:39)
The regular database has caught an unexpected exception: ; nested exception is:
org.xml.sax.SAXException: Invalid element in librarysearch.soft.Book - book
Я прочитал, что проблема может быть вызвана результатом, возвращаемым веб-сервисом, не соответствующим классам, сгенерированным из wsdl. Я восстановил свой клиент веб-сервиса, но безуспешно. В чем еще может быть проблема?
3 ответа
Это может быть связано с этой ошибкой ( AXIS-2758), которая не устранена в Axis 1.x.
Эта проблема может появиться, если ваша клиентская заглушка не обновлена на стороне сервера (файл WSDL). Вы могли бы воссоздать это. Как с axistools: wsdl2java.
Лучшее в настоящее время, при условии, что вы используете хотя бы Java 6, это, возможно, использование JAX-WS на стороне клиента ( плагин JAX-WS Maven). Но он не мог работать со старыми сервисами SOAP, использующими RPC/Encoded... Предпочитаю стиль Document/Literal.
Обходной путь для этой проблемы:
Откройте ваш сгенерированный класс (Для этого вопроса это librarysearch.soft.Book
). Смотрите блок статического кода, который определяет свойства (имя, тип и т. Д.) Полей.
Вы будете что-то вроде ниже:
elemField.setXmlName(new javax.xml.namespace.QName("", "book"));
измените его, добавив namespaceURI к нему (используйте тот же namespameURI
который используется в setXmlType
вызов):
elemField.setXmlName(new javax.xml.namespace.QName("http://your.namespaceuri.here", "book"));
У меня была та же проблема, и после попытки веб-службы с использованием SoapUI я обнаружил две несоответствия между полями, которые я получал в ответе, и полями, сгенерированными WSDL:
1- По какой-то причине, когда я сгенерировал свою структуру из WSDL, после имени поля ставился пробел, например:
elemField.setXmlName(new javax.xml.namespace.QName("http://namespaceuri.here", "book "));
Я просто удалил это место, и это решило проблему.
2- В ответ я получил дополнительное поле, которого не было в моем классе. Здесь я добавил поле в свой класс, а также добавил в статический блок, как и любое другое поле.
Надеюсь, поможет.