2013-05-15 40 views
10

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:

  1. Czy to jeszcze bug?
  2. 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ł.

  1. 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?

Odpowiedz

1

Kod wygenerowany przez CodeGen (z WSDL) dla Java Object (bean), którego używałem, oczekiwał innej przestrzeni nazw dla pól w komponencie bean. W jakiś sposób w kodzie generowanym przez Axis był obecny niepoprawny obszar nazw. Naprawiłem przestrzeń nazw, aby odzwierciedlić to, co powinno być i wszystko działało dobrze. Widzę, że ludzie wciąż odpowiadają na to pytanie, więc pomyślałem, że ponownie opublikuję tutaj moje rozwiązanie (już napisałem to w odpowiedzi na rozwiązanie Kenstera). Ponieważ żadne z opracowanych rozwiązań nie sprawiło, że rozwiązanie zadziałało, nie przyjąłem żadnej odpowiedzi.

10

"Niespodziewane podelement" oznacza, że ​​wiadomość otrzymana przez odbiornik zawiera element XML, którego odbiornik się nie spodziewał. "message {schemaTargetNs}" jest nazwą niespodziewanego napotkanego elementu. Innymi słowy, nadawca wysłał do odbiorcy nieprawidłową wiadomość.

  • Nadawca mógł dołączyć element, którego nie powinien.
  • Nadawca mógł pominąć element obowiązkowy.
  • Nadawca mógł umieścić elementy w niewłaściwej kolejności.
  • Nadawca mógł wysłać całkowicie niepoprawną wiadomość.

Jeśli serwer wysłał zgłoszony wyjątek, klient wysłał na serwer niepoprawny komunikat. Jeśli klient wystawił wyjątek, błąd dotyczył odpowiedzi serwera na klienta.

+0

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

+0

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

+0

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

5

Jeśli xsd (wsdl) jest poprawny z prośbą xml o odpowiedź jest, ponieważ problem jest kolejnością elementów xml. Jednym z możliwych rozwiązań jest generowanie klienta ax2 z opcją -Eosv. to działa dla mnie.

+0

Pracował także dla mnie! –

0

Po sprawdzeniu kodu oś, znalazłem następujące

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

to gdzie błąd zdarza się, . Metoda equals() sprawdzania QName dla localPart & namespaceURI . ale reader.getName() ma URI przestrzeni nazw zestawu i stąd błąd wydarzyło

zmieniłem cały IF-czek z

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

do

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

i to działało w porządku dla mnie

0

Ten błąd może wprowadzać w błąd. Po zmodyfikowaniu pliku WSDL i dodaniu nowego elementu obowiązkowego utworzyłem klienta. Następnie pojawił się ten błąd. Rozwiązaniem było, że zapomniałem wypełnić ten element jedną z metod mojej usługi internetowej. Jeśli pojawi się ten błąd, sprawdź także, czy obowiązkowe elementy są wypełnione w serwerze.

1

Sprawdź swój plik .xsd. Sortuj alfabetycznie elementy xs poniżej swojego <xs:extension base=...>. To pasuje do twoich potrzeb.

0

w moim przypadku usługa sieciowa wysyła elementy w innej kolejności niż sekwencja znajdująca się na XSD. Teraz modyfikuję skrót, więc kolejność nie ma znaczenia, ponieważ nie mam żadnej szansy na zmianę usługi sieciowej.