I stworzył usługę internetową przy użyciu:ADBException: Nieoczekiwany podelement
- Apache Axis 2 Codegen Kreator v.1.6.2 (Oprawa: ADB)
- Eclipse Juno
- Tomcat 7
- Java 6
Usługa zwraca niestandardowy obiekt Java (DataBean) z powrotem do klienta, ale natknąłem się na wyjątek w kodzie klienta:
org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement {schemaTargetNs}message
Z tego co ja zbadali ponad n kółko ... Myślę, że jest to bardzo powszechny problem, ale jeszcze nie ma jednoznacznych odpowiedzi, co należy zrobić, aby je naprawić.
Niektóre posty na tym i na innych forach informują, że plik WSDL musi zostać zmodyfikowany (trochę przestrzeni nazw) lub modyfikator klienta musi zostać zmodyfikowany. Niektórzy twierdzą nawet, że istnieje błąd w ADB. Z pewnością był to błąd we wcześniejszych wersjach Axis, ale w archiwach pocztowych znajduje się wiele postów stwierdzających, że błąd został naprawiony. Te archiwa pocztowe były powiązane z wcześniejszymi wersjami Axis2.
Teraz moje pytania to:
- Czy to jeszcze bug?
- Co dokładnie należy zmienić w pliku WSDL lub kodu pośredniczącego klienta?
Warto zauważyć, że stworzyłem podobną usługę internetową, która zwraca "String" z powrotem do klienta. To działa dobrze ! Tak więc nie działa, gdy zaangażowany jest złożony typ danych.
Było kilka informacji na temat Apache's website, pod nagłówkiem „znane ograniczenia” ...
To brzmi: "ADB ma być«prosty»ramy Databinding i nie miało skompilować wszystko rodzaje schematów. następujące ograniczenia są najbardziej podkreślił.
- Complex rozszerzeń typów i ograniczenia „.
Czy to jest problem?
Poniżej znajduje się fragment z pliku WSDL, który może być z pewnym zainteresowaniem Ciebie ...
<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>
Teraz jak mogę rozwiązać ten problem? Czy powinienem tu dołączyć kilka innych fragmentów kodu?
Błąd jest zdecydowanie w odpowiedzi od serwera, ale jak dowiedzieć się, jakiego elementu oczekiwano? O ile tego nie wiem, nie będę w stanie naprawić rzeczy. Mam XML odpowiedzi z serwera i wydaje mi się, że to dobrze. –
Cóż, jeśli uruchamiasz klienta w debugerze i/lub masz stacktrace dla org.apache.axis2.AxisFault, to możesz znaleźć konkretny wiersz kodu w parserze komunikatów, który rzuca błąd . W tym momencie powinno być oczywiste, jakiego elementu się spodziewał. – Kenster
To prawdopodobnie sprowadza się do faktu, że klient został wygenerowany na podstawie niepoprawnej kopii WSDL. Tak więc odpowiedź wysłana przez serwer nie jest zgodna z oczekiwaniami klienta. – Kenster