Um zusammenzufassen, was andere bereits gesagt oder angedeutet haben, sind die Regeln, nach denen JAXB XJC entscheidet, ob die @XmlRootElementAnnotation einer generierten Klasse hinzugefügt werden soll oder nicht, nicht trivial ( siehe diesen Artikel ).
@XmlRootElementexistiert, 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. @XmlRootElementbietet diese Informationen.
Die Anmerkung ist jedoch nur eine Annehmlichkeit - JAXB benötigt sie nicht. Die Alternative dazu besteht darin, JAXBElementWrapper-Objekte zu verwenden, die dieselben Informationen wie @XmlRootElement, jedoch in Form eines Objekts, anstelle einer Anmerkung bereitstellen .
Das JAXBElementErstellen 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 JAXBElementWrapper 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 ObjectFactoryMethoden durchsehen (und für große Schemata können es Hunderte sein), um die gewünschte zu finden.