Je suis nouveau dans l'utilisation de JAXB et j'ai utilisé xjc de JAXB 2.1.3 pour générer un ensemble de classes à partir de mon schéma XML. En plus de générer une classe pour chaque élément de mon schéma, il a créé une classe ObjectFactory.
Il ne semble y avoir rien qui m'empêche d'instancier directement les éléments, par exemple
MyElement element = new MyElement();
alors que les tutoriels semblent préférer
MyElement element = new ObjectFactory().createMyElement();
Si je regarde ObjectFactory.java, je vois:
public MyElement createMyElement() {
return new MyElement();
}
alors quel est le problème? Pourquoi devrais-je même prendre la peine de conserver la classe ObjectFactory? Je suppose qu'il sera également écrasé si je devais recompiler à partir d'un schéma modifié.
Réponses:
La rétrocompatibilité n'est pas la seule raison. :-P
Avec des schémas plus compliqués, tels que ceux qui ont des contraintes complexes sur les valeurs que le contenu d'un élément peut prendre, vous devez parfois créer des
JAXBElement
objets réels . Ils ne sont généralement pas triviaux à créer à la main, lescreate*
méthodes font donc le travail à votre place. Exemple (du schéma XHTML 1.1):Voici comment insérer une
<style>
balise dans une<head>
balise:Les trois premières utilisations du
ObjectFactory
peuvent être considérées comme superflues (bien qu'utiles pour la cohérence), mais la quatrième rend JAXB beaucoup, beaucoup plus facile à utiliser. Imagerie devant ànew JAXBElement
chaque fois écrire un à la main!la source
Comme @Chris l'a souligné, parfois JAXB ne peut pas fonctionner avec les POJO, car le schéma ne peut pas être mappé exactement sur Java. Dans ces cas, les
JAXBElement
objets wrapper sont nécessaires pour fournir les informations de type supplémentaires.Il y a deux exemples concrets que j'ai rencontrés où cela est courant.
Si vous souhaitez marshaler un objet d'une classe qui ne possède pas l'
@XmlRootElement
annotation. Par défaut, XJC ne génère que@XmlRootElement
pour certains éléments et pas pour d'autres. La logique exacte pour cela est un peu compliquée, mais vous pouvez forcer XJC à générer plus de@XmlRootElement
classes en utilisant le "mode de liaison simple"Lorsque votre schéma utilise des groupes de substitution. Il s'agit d'une utilisation de schéma assez avancée, mais XJC traduit les groupes de substitution en Java en faisant un usage
JAXBElement
intensif des wrappers.Donc, dans un modèle d'objet généré par XJC qui en fait un usage intensif
JAXBElement
(pour une raison quelconque), vous avez besoin d'un moyen de construire cesJAXBElement
instances. Le généréObjectFactory
est de loin le moyen le plus simple de le faire. Vous pouvez les construire vous-même, mais c'est maladroit et sujet aux erreurs.la source
Rétrocompatibilité, je suppose ...
http://weblogs.java.net/blog/kohsuke/archive/2005/08/a_story_of_migr.html :
la source