it-swarm.com.de

ADBException: Unerwartetes Unterelement

Ich habe einen Webdienst erstellt mit:

  • Apache Axis 2 CodeGen Wizard v.1.6.2 (Bindung: ADB)
  • Eclipse Juno 
  • Tomcat 7
  • Java 6

Der Dienst gibt ein benutzerdefiniertes Java-Objekt (DataBean) an den Client zurück, aber ich bin über eine Ausnahme im Clientcode gestolpert:

org.Apache.axis2.AxisFault: org.Apache.axis2.databinding.ADBException: Unexpected subelement {schemaTargetNs}message

Nach allem, was ich recherchiert habe, denke ich, es ist ein sehr verbreitetes Problem, aber ich habe noch keine abschließende Antwort darauf, was zu tun ist, um es zu korrigieren. 

Einige Beiträge in diesem und anderen Foren geben an, dass die WSDL geändert werden muss (einige Namensräume) oder der Client-Stub geändert werden muss. Einige geben sogar an, dass es einen Fehler in der ADB gibt. Es war sicherlich ein Fehler in früheren Versionen von Axis, aber es gibt viele Einträge in den Mail-Archiven, die besagen, dass der Fehler behoben wurde. Diese Mailing-Archive bezogen sich auf frühere Versionen von Axis2. 

Nun sind meine Fragen:

  1. Ist es immer noch ein Fehler?
  2. Was muss in der WSDL oder im Client-Stub genau geändert werden?

Erwähnenswert ist, dass ich einen ähnlichen Web-Service erstellt habe, der einen "String" an den Client zurückgibt. Es funktioniert gut ! Es schlägt also fehl, wenn es sich um einen komplexen Datentyp handelt.

Es gab einige Informationen auf der Webseite von Apache , unter der Überschrift " Bekannte Einschränkungen " ...

Es lautet: " ADB soll ein" einfaches "Datenbindungs-Framework sein und war nicht dazu gedacht, alle Arten von Schemas zu kompilieren. Die folgenden Einschränkungen sind am stärksten hervorgehoben .

  1. Erweiterungen und Einschränkungen für komplexe Typen . "

Ist das das Problem? 

Das Folgende ist ein Ausschnitt aus der WSDL-Datei, der für Sie möglicherweise von Interesse ist ...

<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>

Wie kann ich das Problem beheben? Sollte ich hier einige andere Codeausschnitte einfügen? 

10
Mandeep Singh

Der von CodeGen (von WSDL) für das von mir verwendete Java-Objekt (Bean) generierte Code erwartete einen anderen Namespace für die Felder in dem Bean. Irgendwie war in dem von Axis generierten Code ein falscher Namespace vorhanden. Ich habe den Namespace so korrigiert, dass er das wiedergibt, was eigentlich hätte sein sollen und alles hat gut funktioniert. Ich kann sehen, dass die Leute diese Frage noch beantworten, also dachte ich, ich würde meine Lösung hier erneut posten (habe dies bereits als Antwort auf die Lösung von Kenster gepostet). Da keine der vor mir veröffentlichten Lösungen funktionierte, akzeptierte ich keine Antwort.

1
Mandeep Singh

"Unerwartetes Unterelement" bedeutet, dass die vom Empfänger empfangene Nachricht ein XML-Element enthielt, das der Empfänger nicht erwartet hatte. "{schemaTargetNs} message" ist der Name des unerwarteten Elements, dem es begegnet ist. Mit anderen Worten, der Absender hat eine ungültige Nachricht an den Empfänger gesendet.

  • Der Absender kann ein Element enthalten haben, das er nicht sollte.
  • Der Absender hat möglicherweise ein obligatorisches Element ausgelassen.
  • Der Absender hat die Elemente möglicherweise in die falsche Reihenfolge gebracht.
  • Der Absender hat möglicherweise eine vollständig falsche Nachricht gesendet.

Wenn der Server die von Ihnen gemeldete Ausnahme ausgegeben hat, hat der Client eine ungültige Nachricht an den Server gesendet. Wenn der Client die Ausnahme ausgegeben hat, lag der Fehler in der Antwort des Servers an den Client.

11
Kenster

wenn xsd (wsdl) mit xml-Anforderung korrekt ist, ist die Antwort darauf, dass das Problem in der Reihenfolge der XML-Elemente liegt. Eine mögliche Lösung ist, Ihren axis2-Client mit der Option -Eosv zu generieren. diese Arbeit für mich.

6
Gorson

Schauen Sie in Ihre .xsd-Datei. Sortieren Sie Ihre xs-Elemente alphabetisch unter Ihrem <xs:extension base=...>. Das passt zu Ihren Bedürfnissen.

1
StarCrafter

in meinem Fall sendet der Web Service Elemente in einer anderen Reihenfolge als in der Reihenfolge, die auf dem xsd steht. Ich bin gerade dabei, den Stub zu ändern, damit die Reihenfolge keine Rolle spielt, da ich keine Möglichkeit habe, den Web-Service zu ändern.

0
Julián Sosa

Dieser Fehler kann irreführend sein. Nachdem ich die WSDL geändert und ein neues obligatorisches Element hinzugefügt habe, habe ich meinen Client erstellt. Dann trat dieser Fehler auf. Die Lösung war, dass ich vergessen habe, dieses Element in einer Methode meines Webservices auszufüllen. Wenn dieser Fehler auftritt, prüfen Sie auch, ob Ihre obligatorischen Elemente auf dem Server vorhanden sind.

0
Klendatho

Als ich den Achscode überprüft habe, habe ich Folgendes gefunden

if( new javax.xml.namespace.QName("http://someurl","someElementName").equals(reader.getName()) )

hier passiert ein Fehler, . Die equals () -Methode von QName prüft auf localPart & namespaceURI . Für reader.getName () ist jedoch kein Namespace-URI festgelegt, und daher ist der Fehler aufgetreten

Ich habe alle If-Check von geändert

if( new javax.xml.namespace.QName("http://someurl","someElementName").equals(reader.getName()) )

zu

if( new javax.xml.namespace.QName("someElementName").equals(reader.getName()) )

und es hat gut für mich funktioniert

0
deenfirdoush

Ich hatte das gleiche Problem. Wenn das base64binary 16k-Limit überschritten wird, beginnt der Parser mit dem Fehler. Im Wesentlichen hört das Lesen des Inhalts nach 16k auf, so dass der Rest des Dokuments offensichtlich beschädigt erscheint.

Mein Problem war, dass ich com.Sun.xml.stream.XMLReaderImpl verwendete. 

Entfernen

<dependency>
<groupId>com.Sun.xml.stream</groupId>
<artifactId>sjsxp</artifactId>
</dependency>

und hinzufügen

<dependency>
<groupId>org.codehaus.woodstox</groupId>
<artifactId>wstx-asl</artifactId>
</dependency>

mein Problem gelöst (also wstx, wie vorgeschlagen, bevor es funktionierte)

0
Stefano Ghezzi