Die letzten Tage hat mich ein Problem mit Jax-WS sehr beschäftigt (=fast in den Wahnsinn getrieben)
Ich habe einen Jax-WS Client (Metro-Implementierung) geschrieben, der einen Web Service aufruft und Rückgabeparameter erwartet. Leider waren diese Rückgabewerte allesamt auf "Null" gesetzt. Ich hatte jedoch mit SoapUI die Soap-Antwort des Servers überprüft und habe gesehen, dass die Rückgabewerte korrekt übertragen werden. Auch mit Axis2 hat es wie gewünscht funktioniert.
Die Schwierigkeit war, dass es keinerlei Fehlermeldung oder Warnhinweis gab. Von daher half nur stundenlanges googeln und sich von Kollegen inspirieren zu lassen.
Nach und nach konnte ich das Problem auf JAXB eingrenzen. JAXB ist dafür verantwortlich, die SOAP Nachricht zu parsen und daraus Java Objekte zu machen und genau das ging ja offensichtlich schief.
Im Endeffekt hat sich dann (nach vielen weiteren Tests) herausgestellt, dass es ein Problem mit den Namensräumen gab. In de WSDL (Schema-Abschnitt) war folgendes definiert:
elementFormDefault="qualified"
In den Client-Stubs, die über wsimport erstellt wurden, war jedoch in der Datei package-info.java kein entsprechender Eintrag zu finden. Und dies bedeutet, dass der Default, nämlich unqualified verwendet wird. Das ganze lässt sich über folgende Annotation richtigstellen:
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.namespace.de",elementFormDefault = XmlNsForm.QUALIFIED)
-und schon wurden die Rückgabewerte wie erwartet gefüllt.
Ob dies nun ein Fehler im JAXB ist (was mich bei der Verbreitung von JAXB wundern würde) oder ob irgendein Detail in der WSDL bzw. in der Schema Datei fehlerhaft ist, kann ich nicht mit Sicherheit sagen.
Keine Kommentare:
Kommentar veröffentlichen