piątek, października 26

Axis2 - ADBException: Unexpected subelement

(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ę ręczne pisanie i składanie envelope. Jeżeli 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, jeżeli 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 skrócie twórcy ustawili to mapowanie jako podstawowe bo uważają je za ‘suitable’.


Wracając do sedna sprawy, skąd ten problem jest jeżeli 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, że 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ę, że was nie zanudziłem, już kończę, pozdrawiam was, Arkadiusz Borek


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

piątek, marca 23

33degree

po 2012.33degree, Witam

Pojawiłem się dzisiaj po konferencji 2012.33degree w pracy i zostałem zapytany czego nowego się dowiedziałem. Wyobraźcie sobie zdziwienie pytającego gdy odpowiedziałem: 'Nowe rzeczy można policzyć na palcach u jednej ręki'. Podczas powrotu do domu, zacząłem się zastanawiać czy naprawdę tak mało nowych informacji dotarło do mojej głowy. Informacje które to z jakiegoś powodu zakotwiczyły mi się w głowie przedstawię w poście.

Informacje zostaną uporządkowane wykładami, pomoże mi to na przypomnienie sobie informacji i wam drodzy czytelnicy powinno ułatwić czytanie.

Chcę na początku zaznaczyć, że post będzie długi - po chwili zastanowienia okazało się, że jednak czegoś dowiedziałem się lub przypomniałem sobie. Jeżeli masz ochotę to polecam cały wpis, jeżeli nie to proszę wybierz sobie jeden wykład.



Twitter: From Ruby on Rails to the JVM - Raffi Krikorian

  • twitter nadal zostaje na ruby stack, java została wprowadzona tylko w krytycznych elementach systemu
  • java okazała się jednak nie tak wydajna jak chcieli, zmodyfikowany został GC zważywszy na charakterystykę systemu - bardzo krótko żyjące miliardy obiektów
  • reasumując - jeżeli system ma być ekstremalnie wydajna musi być napisany w pure Java
  • architektura twittera - klient komunikuje się z gate-server który to wyznacza serwer odpowiedzialny za odpowiedź



Complexity of Complexity - Ken Sipe

  • nie wiem czy usłyszałem to na tym wykładzie: nie pisz nowego frameworka, gdy istnieje już gotowy realizujący to samo i w dodatku darmowy
  • programiści bywają fanami komplikowania(nie mylić z kompilowaniem :P) kodu; każdy tworzony kod powinien być możliwie jak najbardziej prosty, biznes zatroszczy się o skomplikowanie naszego kodu
  • pisz kod najprościej jak się da, ale nie prościej



Pointy haired bosses and pragmatic programmers: Facts and Fallacies of Software Development - Venkat Subramaniam

  • pytaj 'DLACZEGO', zawsze 5 razy pytaj 'DLACZEGO', niczego nie przyjmuj na 'wiarę'



Dart - Mike West

  • JavaScript i jQuery stworzone zgodnie z religią Google; po co nam to ?



Non blocking, composable reactive web programming with Iteratees - Sadek Drobi

  • push jest lepszy od pool; Play2.0 pozwala na informowanie UI o zmianach



"Every Rose Has Its Thorn": Taming automated tests beast. - Wojciech Seliga

  • budowanie aplikacji to bardzo skomplikowany proces
  • rozbijaj projekty na jak najmniejsze
  • budowanie powinno odbywać się zawsze w gałęzi gdzie nastąpiły zmiany
  • nieraz programowo nie możesz przyśpieszyć builda, dlatego też puszczasz go na 40 noda w chmurze amazona



Vaadin, Rich Web Apps in Server-Side Java without Plug-ins or JavaScript - Joonas Lehtinen

  • zostałem zauroczony vaadinem, poużywam go to wypowiem się więcej
  • zobaczyłem większy hello world - jestem pełen euforii



Ścisły przewodnik po aspektach miękkich dla ekspertów IT (Polish) - Sławomir Sobótka



Scala for the Intrigued - Venkat Subramaniam

  • ekspresja i energia prowadzącego zachęciła mnie do instalacji kompilatora Scali
  • rozbawiło mnie stwierdzenie, że programowanie dzisiaj w Javie jest jak programowanie w asemblerze, gdy mamy do dyspozycji scale, grooviego



Integrating JVM Languages - Venkat Subramaniam

  • Venkat zapytany kiedyś dlaczego nie przygotuje takiej prezentacji odpowiadał: 'Przecież integracja jeżyków rodziny JVM działa'
  • prowadzący pokazał kilka miejsc gdzie integracja nie działa do końca intuicyjnie
  • nigdy nie mieszaj języków w ramach jendego projektu - projekt per język



MongoDB: Scaling Web Application - - Ken Sipe

  • hello world dla MongoDB
  • MongoDB to rozwiązanie dojrzałe



The Three Laws of Test Driven Development - Robert C. Martin

  • opis prezentacji Uncle Bob'a powstał zanim przeczytałem wpis Sławka; teść posta nie została zmieniona, mam wrażenie, że Sławek zbyt wybiórczo potraktował wypowiedzi
  • ekspresja i oczywiście Uncle Bob
  • zawsze powinieneś pisać TTD, nawet gdy w twoje obecnej firmie się tego nie robi
  • jeżeli chcesz by w twojej obecnej firmie kodowano przy pomocy TTD, zacznij kodować w TDD - or you change organization, or you change organization :-)
  • każda linia testu obliguje cię do napisania kodu w produkcji
  • pisanie testów nie zwiększa twojego czasu pracy o 50% tylko 0 20% bo pisanie testów to zapisanie cyklu myślowego - jak twoja funkcja powinna działać
  • miara testów: dobrze napisane testy to takie, że wprowadzenie zmiany w kodzie, przy wynikach testów w postaci green bar daje Ci pewność w 100%, że kod działa poprawnie
  • testy muszą się wykonywać w mniej niż 1s
  • jeżeli re faktorujesz kod nie zmieniaj testów, skasuj je, to test powinien obligować Cię do napisania linii w kodzie produkcyjnym; tak zdefiniowana re faktoryzacja prowadzi do pisania tylko nowych testów
  • każdy 'monster' stworzony w kodzie do którego nikt nie chce komitować zmian musi być jak najszybciej wyrzucony - bezwarunkowo
  • testy muszą dawać Ci taką pewność, że w każdym momencie możesz wprowadzić zmianę w kodzie i przy green bar wiesz, że system działa poprawnie



Code Craft - Nathaniel Schutta

  • solidny wykład, merytoryczny polecam znalezienie slajdów w sieci



How to Change the World - Jurgen Appelo

  • miękki wykład - sporadycznie takie rozumiem :P



Demanding Professionalism - Robert C. Martin

  • skupiony byłem na powrocie