Um zusammenzufassen, was andere bereits gesagt oder angedeutet haben, sind die Regeln, nach denen JAXB XJC entscheidet, ob die @XmlRootElement
Annotation einer generierten Klasse hinzugefügt werden soll oder nicht, nicht trivial ( siehe diesen Artikel ).
@XmlRootElement
existiert, weil die JAXB-Laufzeit bestimmte Informationen benötigt, um ein bestimmtes Objekt zu marshallen / unmarshalen, insbesondere den Namen und den Namespace des XML-Elements. Sie können nicht einfach ein altes Objekt an den Marshaller übergeben. @XmlRootElement
bietet diese Informationen.
Die Anmerkung ist jedoch nur eine Annehmlichkeit - JAXB benötigt sie nicht. Die Alternative dazu besteht darin, JAXBElement
Wrapper-Objekte zu verwenden, die dieselben Informationen wie @XmlRootElement
, jedoch in Form eines Objekts, anstelle einer Anmerkung bereitstellen .
Das JAXBElement
Erstellen von Objekten ist jedoch umständlich, da Sie den Namen und den Namespace des XML-Elements kennen müssen, was in der Geschäftslogik normalerweise nicht der Fall ist.
Zum Glück generiert XJC beim Generieren eines Klassenmodells auch eine Klasse namens ObjectFactory
. Dies dient zum Teil der Abwärtskompatibilität mit JAXB v1, ist aber auch ein Ort, an dem XJC generierte Factory-Methoden platzieren kann, mit denen JAXBElement
Wrapper um Ihre eigenen Objekte erstellt werden. Es behandelt den XML-Namen und den Namespace für Sie, sodass Sie sich darüber keine Gedanken machen müssen. Sie müssen nur die ObjectFactory
Methoden durchsehen (und für große Schemata können es Hunderte sein), um die gewünschte zu finden.