Pour lier ce que les autres ont déjà dit ou fait allusion à l', les règles par lesquelles JAXB XJC décide ou non de mettre la @XmlRootElement
annotation sur une classe générée sont non trivial (voir cet article).
@XmlRootElement
existe parce que la JAXB runtime exige que certaines informations afin de maréchal/unmarshal un objet donné, plus précisément le nom de l'élément XML et l'espace de noms. Vous ne pouvez pas vous passer de tout objet ancien pour le Marshaller. @XmlRootElement
fournit cette information.
L'annotation est juste une commodité, cependant - JAXB ne le nécessite pas. L'alternative est d'utiliser JAXBElement
wrapper objets, qui fournissent les mêmes informations que l' @XmlRootElement
, mais sous la forme d'un objet, plutôt que d'une annotation.
Toutefois, JAXBElement
des objets sont difficiles à construire, car vous avez besoin de connaître le nom de l'élément XML et l'espace de noms, dont la logique d'entreprise n'est généralement pas le cas.
Heureusement, quand XJC génère un modèle de classe, il génère aussi une classe appelée ObjectFactory
. C'est en partie là pour assurer la compatibilité ascendante avec JAXB v1, mais c'est aussi là que d'un endroit pour XJC de mettre généré usine méthodes qui créent JAXBElement
wrappers autour de vos propres objets. Il gère le XML, le nom et l'espace de noms pour vous, donc vous n'avez pas besoin de s'inquiéter à ce sujet. Vous avez juste besoin de regarder à travers l' ObjectFactory
méthodes (et pour les grands schéma, il peut y avoir des centaines d'entre eux) pour trouver celui dont vous avez besoin.