Axis2 - ADBException: Unexpected subelement

arekborek.blogspot.com 1 dekada temu
(Jeżeli nie chce Ci się czytać postu a interesuję Cię tylko rozwiązanie przeczytaj wyboldowany tekst.)

Witam,

dawno mnie nie było na blogu, sorry za to. Przepraszam tych którym zdarza się zabłądzić i trafiają tutaj.


Ostatnio mam okazję kodować web service napisany w Axis2. Zakodowałem kilka linii, napisałem kilka unit test, ale chciałem zobaczyć czy mój web service odpowiada dlatego też pojawiły się testy integracyjne.

Problem jaki zaraz opiszę dotyczy tylko klientów i serwerów wygenerowanych automatycznie, nie wchodzi w grę manualne pisanie i składanie envelope. o ile serwer lub klienta napisaliście z palca to zapomnijcie o tym poście na pewno problem jest w waszym kodzie. Sorry, za takie gadanie ale nauczyłem się tego, żeby zaczynać szukać błędu od własnego kodu.

Testy integracyjne wymagały ode mnie wygenerowania klienta, wystarczyło w cmd wpisać następującą komendę:
%AXIS2_HOME%\bin\WSDL2Java -uri Axis2UserGuide.wsdl -p org.apache.axis2.axis2userguide -d adb
Wszystkie opcje znane, o ile nie to można na razie to pominąć post nie będzie tego dotyczył. Nie do końca, bo problem jaki został zaznaczony w tytule postu dotyczy opcji ‘-d’.

Przełącznik ‘-d’ wskazuje mechanizm jaki będzie użyty do data bindingu, a w powyższym zapisanie będzie to ADB. Tak naprawdę to nie wgryzałem się w problem data bindingu w momencie gdy startowałem prace, chodziło mi raczej o rozpoczęcie kodowania funkcjonalności. ADB data bindig zostało użyte bo taka wartość jest domyślna, a na stronie apache można znaleźć coś takiego: “...”, nie pamiętam co tam było napisane ale w uproszczeniu twórcy ustawili to mapowanie jako podstawowe bo uważają je za ‘suitable’.


Wracając do sedna sprawy, skąd ten problem jest o ile klient został wygenerowany automatycznie, przy pomocy narzędzi jakie dostarcza twórca biblioteki, a tu taki klops, o co chodzi z tym errorem. Bład wynika z faktu, iż plik wsdl zawiera elementu w innej kolejności niż plik requesta lub responsa w postaci xml. Np.: w pliku wsdl występują elementy w kolejności a, b, c, a plik xml zawiera elementy w kolejności a, c, b lub każdej innej niż a, b, c.

Czas na rozwiązanie, które to też było banalne. Ale nie zaczniemy od tego jakie można znaleźć na większości forach i portali, piszą tam: ‘Problem jest banalny wystarczy zmienić kolejność elementów w wsdl’. Jak dla mnie jest to rozwiązanie nie do zaakceptowania, dlatego też poszukałem innego rozwiązania jeszcze prostszego, czyli wygenerowanie klienta z innym data bindingiem.

Rozwiązanie - należy w cmd wpisać coś takiego:
%AXIS2_HOME%\bin\WSDL2Java -uri Axis2UserGuide.wsdl -p org.apache.axis2.axis2userguide -d xmlbeans
Spowoduje to wygenerowanie kodu klienta w oparciu o xmlbeans data binding, a tak wygenerowany klient jest odporny na zmianę kolejności. Kod jaki został wygenerowany dla mapowania xmlbeans, może jest lekko bardziej skomplikowany niż dla ADB, ale nie jest to żadne rocket sience.

Mam nadzieję, iż was nie zanudziłem, już kończę, pozdrawiam was, Arkadiusz Borek


ps. Mam nadzieję, iż i wasze codzienne problemy w pracy można rozwiązać w tak błahy sposób.

Idź do oryginalnego materiału