ho creato un servizio Web utilizzando:ADBException: sottoelemento imprevisto
- Apache Axis 2 CodeGen guidata v.1.6.2 (Binding: ADB)
- Eclipse Juno
- Tomcat 7
- Java 6
il servizio restituisce un oggetto Java personalizzato (bean di dati) al client, ma sono incappato in un'eccezione nel codice client:
org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement {schemaTargetNs}message
Da quello che ho cercato, ancora n di nuovo ... Penso che questo sia un problema molto comune ma non hanno ancora avuto una risposta definitiva su cosa dovrebbe essere fatto per correggerlo.
Alcuni post su questo e altri forum indicano che il WSDL deve essere modificato (un po 'di spazio dei nomi), o lo stub del client necessita di modifica. Alcuni affermano addirittura che c'è un bug nell'ADB. È stato sicuramente un bug nelle versioni precedenti di Axis, ma ci sono molti post negli archivi di posta che affermano che il bug è stato corretto. Questi mailing-archives erano correlati alle precedenti versioni di Axis2.
Ora le mie domande sono:
- È ancora un bug?
- Che cosa esattamente deve essere modificato nel WSDL o nello stub del client?
Ciò che è degno di nota è che ho creato un servizio Web simile che restituisce una "stringa" al client. Funziona bene! Quindi, fallisce quando è coinvolto un tipo di dati complesso.
C'era alcune informazioni sul Apache's website, sotto il titolo "Limitazioni note" ...
Si legge: "ADB è destinata ad essere un quadro databinding 'semplice' e non aveva lo scopo di compilare tutte tipi di schemi. le seguenti limitazioni sono più evidenziati.
- estensioni tipo complesso e limiti ".
È questo il problema?
Il seguente è il frammento di codice dal file WSDL che potrebbe essere di qualche interesse per voi ...
<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>
Ora come posso risolvere il problema? Dovrei includere qualche altro frammento di codice qui?
L'errore è sicuramente nella risposta dal server, ma come scoprire quale elemento era previsto? A meno che non lo sappia, non sarò in grado di sistemare le cose. Ho la risposta XML dal server e mi sembra soddisfacente. –
Bene, se dovessi eseguire il client in un debugger e/o se avessi lo stacktrace per org.apache.axis2.AxisFault, potresti trovare la riga di codice specifica nel parser del messaggio che sta generando l'errore . A quel punto dovrebbe essere ovvio quale elemento si aspettava. – Kenster
Probabilmente si tratta del fatto che il client è stato generato in base a una copia non corretta del WSDL. Quindi la risposta inviata dal server non corrisponde a ciò che il cliente si aspetta. – Kenster