Ich bin neu in der Verwendung von JAXB und habe xjc von JAXB 2.1.3 verwendet, um eine Reihe von Klassen aus meinem XML-Schema zu generieren. Zusätzlich zum Generieren einer Klasse für jedes Element in meinem Schema wurde eine ObjectFactory-Klasse erstellt.
Es scheint mich nichts daran zu hindern, die Elemente direkt zu instanziieren, z
MyElement element = new MyElement();
während Tutorials zu bevorzugen scheinen
MyElement element = new ObjectFactory().createMyElement();
Wenn ich in ObjectFactory.java schaue, sehe ich:
public MyElement createMyElement() {
return new MyElement();
}
Also, was ist der Deal? Warum sollte ich mir überhaupt die Mühe machen, die ObjectFactory-Klasse beizubehalten? Ich gehe davon aus, dass es auch überschrieben wird, wenn ich aus einem geänderten Schema neu kompiliere.
Antworten:
Abwärtskompatibilität ist nicht der einzige Grund. :-P
Bei komplizierteren Schemata, z. B. solchen, bei denen die Werte, die der Inhalt eines Elements annehmen kann, komplizierte Einschränkungen aufweisen, müssen Sie manchmal tatsächliche
JAXBElement
Objekte erstellen . Sie sind normalerweise nicht trivial von Hand zu erstellen, dahercreate*
erledigen die Methoden die harte Arbeit für Sie. Beispiel (aus dem XHTML 1.1-Schema):So erhalten Sie ein
<style>
Tag in ein<head>
Tag:Die ersten drei Verwendungen von
ObjectFactory
könnten als überflüssig angesehen werden (obwohl sie für die Konsistenz nützlich sind), aber die vierte macht die Verwendung von JAXB sehr viel einfacher. Imaging mussnew JAXBElement
jedes Mal von Hand ausschreiben!quelle
Wie @Chris betonte, kann JAXB manchmal nicht mit POJOs arbeiten, da das Schema nicht genau auf Java abgebildet werden kann. In diesen Fällen sind
JAXBElement
Wrapper-Objekte erforderlich, um die zusätzlichen Typinformationen bereitzustellen.Es gibt zwei konkrete Beispiele, auf die ich gestoßen bin, wo dies üblich ist.
Wenn Sie ein Objekt einer Klasse ohne
@XmlRootElement
Annotation marshallen möchten . Standardmäßig generiert XJC nur@XmlRootElement
für einige Elemente und nicht für andere. Die genaue Logik hierfür ist etwas kompliziert, aber Sie können XJC zwingen,@XmlRootElement
mithilfe des "einfachen Bindungsmodus" mehr Klassen zu generieren.Wenn Ihr Schema Substitutionsgruppen verwendet. Dies ist eine ziemlich fortgeschrittene Schema-Verwendung, aber XJC übersetzt Substitutionsgruppen in Java, indem es
JAXBElement
Wrapper stark nutzt .In einem von XJC generierten Objektmodell, das
JAXBElement
(aus welchen Gründen auch immer) stark genutzt wird, benötigen Sie eine Möglichkeit, dieseJAXBElement
Instanzen zu erstellen . Das GenerierteObjectFactory
ist bei weitem der einfachste Weg, dies zu tun. Sie können sie selbst erstellen, dies ist jedoch umständlich und fehleranfällig.quelle
Abwärtskompatibilität, denke ich ...
http://weblogs.java.net/blog/kohsuke/archive/2005/08/a_story_of_migr.html :
quelle