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. Я сейчас изменяю заглушку, поэтому порядок не имеет значения, потому что у меня нет шансов изменить веб-службу.