ADBException: Неожиданный подэлемент
Я создал веб-сервис, используя:
- Apache Axis 2 CodeGen Wizard v.1.6.2 (Binding: ADB)
- Eclipse Juno
- Tomcat 7
- Java 6
Служба возвращает пользовательский объект Java (DataBean) обратно клиенту, но я наткнулся на исключение в клиентском коде:
org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement {schemaTargetNs}message
Из того, что я исследовал, над n снова... Я думаю, что это очень распространенная проблема, но еще не получила окончательного ответа относительно того, что нужно сделать, чтобы исправить ее.
В некоторых сообщениях на этом и других форумах указано, что WSDL необходимо изменить (какое-то пространство имен), или клиенту необходимо изменить его. Некоторые даже утверждают, что в ADB есть ошибка. Это была ошибка в более ранних версиях Axis, но в почтовых архивах есть много сообщений о том, что ошибка исправлена. Эти почтовые архивы были связаны с более ранними версиями Axis2.
Теперь мои вопросы:
- Это все еще ошибка?
- Что именно нужно изменить в WSDL или клиенте?
Следует отметить, что я создал аналогичную веб-службу, которая возвращает "String" обратно клиенту. Он отлично работает! Таким образом, он терпит неудачу, когда задействован сложный тип данных.
На веб-сайте Apache появилась некоторая информация под заголовком Известные ограничения"...
Он гласит: " ADB предназначен для" простой "структуры привязки данных и не предназначен для компиляции всех типов схем. Ниже перечислены наиболее важные ограничения.
- Расширения и ограничения сложных типов.
Это проблема?
Ниже приведен фрагмент из файла WSDL, который может вас заинтересовать...
<wsdl:types>
<xs:schema xmlns:ax26="http://mywebservice/xsd" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="schemaTargetNs">
<xs:import namespace="http://mywebservice/xsd"/>
<xs:element name="getMsg">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="reqData" nillable="true" type="ax25:DataBean"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getMsgResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" name="return" nillable="true" type="ax25:DataBean"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
<xs:schema attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://mywebservice/xsd">
<xs:complexType name="DataBean">
<xs:sequence>
<xs:element minOccurs="0" name="message" nillable="true" type="xs:string"/>
<xs:element minOccurs="0" name="name" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
Теперь, как я могу исправить проблему? Должен ли я включать некоторые другие фрагменты кода здесь?
Ответы
Ответ 1
Код, созданный CodeGen (из WSDL) для объекта Java (bean), который я использовал, ожидал другого пространства имен для полей в bean. Так или иначе в коде, создаваемом Axis, присутствовало некорректное пространство имен. Я исправил пространство имен, чтобы отразить то, что должно было быть, и все сработало нормально. Я вижу, что люди все еще отвечают на этот вопрос, поэтому подумал, что я снова отправлю свое решение здесь (уже отправил это в ответ на решение Kenster). Поскольку ни одно из решений не переписало меня, чтобы найти решение, я не принял никакого ответа.
Ответ 2
"Неожиданный субэлемент" означает, что сообщение, полученное получателем, содержало элемент XML, который не ожидал получатель. "{schemaTargetNs} message" - это имя неожиданного элемента, с которым он столкнулся. Другими словами, отправитель отправил недопустимое сообщение получателю.
- Отправитель, возможно, включил элемент, который он не должен был.
- Отправитель может оставить обязательный элемент.
- Отправитель может поставить элементы в неправильном порядке.
- Отправитель может отправить совершенно неверное сообщение.
Если сервер выдал исключение, о котором вы сообщили, клиент отправил на сервер недопустимое сообщение. Если клиент выдал исключение, тогда ошибка была в ответе от сервера клиенту.
Ответ 3
если xsd (wsdl) верен с запросом xml запроса o, потому что проблема заключается в порядке элементов xml. Одним из возможных решений является создание вашего клиента axis2 с параметром -Eosv. которые работают для меня.
Ответ 4
Посмотрите на свой .xsd файл. Отсортируйте элементы xs в алфавитном порядке ниже <xs:extension base=...>
. Это будет соответствовать вашим потребностям.
Ответ 5
Когда я проверил код оси, я нашел следующее
if( new javax.xml.namespace.QName("http://someurl","someElementName").equals(reader.getName()) )
здесь происходит ошибка,
, Метод equals() проверки QName для localPart и namespaceURI
, но reader.getName() не имеет набора URI пространства имен и, следовательно, события с ошибкой
Я изменил все if-check из
if( new javax.xml.namespace.QName("http://someurl","someElementName").equals(reader.getName()) )
к
if( new javax.xml.namespace.QName("someElementName").equals(reader.getName()) )
и он отлично работал у меня
Ответ 6
Эта ошибка может вводить в заблуждение. После того как я модифицировал WSDL и добавил новый обязательный элемент, я создал своего клиента. Чем эта ошибка появилась. Решение состояло в том, что я забыл заполнить этот элемент одним методом моего веб-сервиса. Если эта ошибка появляется, проверьте также, заполнены ли ваши обязательные элементы на сервере.
Ответ 7
в моем случае веб-служба отправляет элементы в другом порядке, чем последовательность, которая находится на xsd. Я сейчас изменяю заглушку, поэтому порядок не имеет значения, потому что у меня нет шансов изменить веб-службу.