Wenn Sie JAX-WS Sie verwenden eine JAXB Implementierung der Java-Objekte XML serialisiert werden.
Also, das 'Problem' ist, wie JAXB funktioniert.
JAXB verwenden, müssen Sie ein JAXBContext Leiten alle Klassen erstellen, die/unmarshal gemarshallt werden kann. Beim Erstellen des Kontexts prüft JAXB, ob alle angegebenen Klassen einen Konstruktor ohne Argumente haben. Wenn mindestens eine dieser Klassen nicht über diese Art von Konstruktor verfügt, wird der Kontext nicht erstellt.
Warum JAXB dies tun? Er benötigt diesen no-arg-Konstruktor NUR bei der Umwandlung von XML in Object (Unmarshalling), aber das Problem ist, wenn Sie den Kontext erstellen, JAXB weiß nicht, was Sie tun wollen (Marshal oder Unmarshal)!
Fazit: JAXB akzeptiert nur Klassen, die es marshalieren UND unmarshalen kann. Weitere Informationen here
Wissen, was passiert in JAX-WS?
Wenn Sie deklarieren einen @WebMethod
die Parameter und Rückgabewert Klassen werden zu einem JAXB Kontext hinzugefügt werden. Aus diesem Grund benötigen alle Klassen, die sich auf die Eingabe und Ausgabe eines Webdienstes beziehen, einen Konstruktor ohne Argumente.
Fazit: ist JAXB Fehler ;-)
Aber was, wenn ich brauche eine Klasse zu verwenden, die keine nicht-arg Konstruktor hat?
Sie können einen XMLAdapter verwenden! Überprüfen Sie this post für weitere Informationen ...
So scheint das Problem zu sein, dass JAXB nicht zwischen Klassen unterscheidet, die es Marshalling oder Unmarshale hat. Wenn diese Funktion unterstützt wurde, konnte JAX-WS einen entsprechenden JAXBContext erstellen. Ich denke, das würde eine nette Feature-Anforderung für eine kommende JAXB-Spezifikation machen. – Stefan
Ich stimme Ihnen voll und ganz zu. Tatsächlich haben die Leute von MOXy (eine JAXB-Implementierung von EclipseLink) ein offenes Ticket, um Unterstützung für Konstruktoren mit mehreren Argumenten hinzuzufügen: https://bugs.eclipse.org/bugs/show_bug.cgi?id=328951 – ggarciao