{"id":3878,"date":"2017-06-17T19:45:38","date_gmt":"2017-06-17T17:45:38","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=3878"},"modified":"2017-06-17T19:45:38","modified_gmt":"2017-06-17T17:45:38","slug":"jaxb-beans-aus-xml-schema-datei-generieren","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2017\/06\/jaxb-beans-aus-xml-schema-datei-generieren\/","title":{"rendered":"JAXB-Beans aus XML-Schema-Datei generieren"},"content":{"rendered":"<p>Da es f\u00fcr existierende XML-Dateien m\u00fchselig ist, die annotierten JavaBeans von Hand aufzubauen, gibt es einen Generator, genannt Java Architecture for XML Binding Compiler, kurz xjc. Er kann von der Kommandozeile, von Maven, aus einem Ant-Skript oder auch von Entwicklungsumgebungen aus aufgerufen werden. Er nimmt eine XML-Schema-Datei und generiert die Java-Klassen und eine ObjectFactory, die als \u2013 wie der Name schon sagt \u2013 Fabrik f\u00fcr die gemappten Objekte aus den XML-Elementen fungiert.<\/p>\n<h4>xjc aufrufen<\/h4>\n<p>Im ersten Schritt wechseln wir auf die Kommandozeile und testen entweder, ob das bin-Verzeichnis vom JDK im Suchpfad ist, oder wir wechseln in das bin-Verzeichnis, sodass wir xjc direkt aufrufen k\u00f6nnen, und folgende Ausgabe erscheint:<\/p>\n<pre>$ <strong>xjc -help<\/strong>\n\nVerwendung: xjc [-options ...] &lt;schema file\/URL\/dir\/jar&gt; ... [-b &lt;bindinfo&gt;] ...\n\nWenn dir angegeben wird, werden alle Schemadateien im Verzeichnis kompiliert.\n\nWenn jar angegeben wird, wird die \/META-INF\/sun-jaxb.episode-Binding-Datei kompiliert.\n\nOptionen:\n\n\u00a0 -nv\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 F\u00fchrt keine strikte Validierung der Eingabeschemas durch\n\n\u00a0 -extension\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 L\u00e4sst Herstellererweiterungen zu - Befolgt die\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Kompatibilit\u00e4tsregeln und App E.2 der JAXB-Spezifikation nicht strikt\n\n\u00a0 -b &lt;file\/dir&gt;\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 Gibt externe Bindings-Dateien an (jede &lt;file&gt; muss ihre eigene Option -b haben)\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 Wenn ein Verzeichnis angegeben wird, wird **\/*.xjb durchsucht\n\n\u00a0 -d &lt;dir&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 Generierte Dateien werden in diesem Verzeichnis gespeichert\n\n\u00a0 -p &lt;pkg&gt;\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 Gibt das Zielpackage an\n\n\u00a0 -httpproxy &lt;proxy&gt; :\u00a0 set HTTP\/HTTPS proxy. Format ist [user[:password]@]proxyHost:proxyPort\n\n\u00a0 -httpproxyfile &lt;f&gt; : Wird wie -httpproxy verwendet, verwendet jedoch das Argument in einer Datei zum Schutz des Kennwortes\n\n\u00a0 -classpath &lt;arg&gt;\u00a0\u00a0 :\u00a0 Gibt an, wo die Benutzerklassendateien gefunden werden\n\n\u00a0 -catalog &lt;file&gt;\u00a0\u00a0\u00a0 :\u00a0 Gibt Katalogdateien zur Aufl\u00f6sung von externen Entity-Referenzen an\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Unterst\u00fctzt TR9401, XCatalog und OASIS-XML-Katalogformat.\n\n\u00a0 -readOnly\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 Generierte Dateien werden im schreibgesch\u00fctzten Modus gelesen\n\n\u00a0 -npa\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 Unterdr\u00fcckt die Generierung von Annotationen auf Packageebene (**\/package-info.java)\n\n\u00a0 -no-header\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 Unterdr\u00fcckt die Generierung eines Datei-Headers mit Zeitstempel\n\n\u00a0 -target (2.0|2.1)\u00a0 :\u00a0 Verh\u00e4lt sich wie XJC 2.0 oder 2.1 und generiert Code, der keine 2.2-Features verwendet.\n\n\u00a0 -encoding &lt;encoding&gt; :\u00a0 Gibt Zeichencodierung f\u00fcr generierte Quelldateien an\n\n\u00a0 -enableIntrospection :\u00a0 Aktiviert die ordnungsgem\u00e4\u00dfe Generierung von booleschen Gettern\/Settern zur Aktivierung von Bean Introspection-APIs\n\n\u00a0 -contentForWildcard\u00a0 :\u00a0 Generiert Contenteigenschaft f\u00fcr Typen mit mehreren von xs:any abgeleiteten Elementen\n\n\u00a0 -xmlschema\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 Behandelt Eingabe als W3C-XML-Schema (Standard)\n\n\u00a0 -relaxng\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 Behandelt Eingabe als RELAX NG (experimentell, nicht unterst\u00fctzt)\n\n\u00a0 -relaxng-compact\u00a0\u00a0 :\u00a0 Behandelt Eingabe als RELAX NG-Kompaktsyntax (experimentell, nicht unterst\u00fctzt)\n\n\u00a0 -dtd\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 Behandelt Eingabe als XML DTD (experimentell, nicht unterst\u00fctzt)\n\n\u00a0 -wsdl\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 Behandelt Eingabe als WSDL und kompiliert enthaltene Schemas (experimentell, nicht unterst\u00fctzt)\n\n\u00a0 -verbose\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 Verwendet extra-verbose\n\n\u00a0 -quiet\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 Unterdr\u00fcckt die Compilerausgabe\n\n\u00a0 -help\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 Zeigt diese Hilfemeldung an\n\n\u00a0 -version\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 Zeigt Versionsinformationen an\n\n\u00a0 -fullversion\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 Zeigt vollst\u00e4ndige Versionsinformationen an\n\n\n\n\n\n\n\nErweiterungen:\n\n\u00a0 -Xinject-code\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 inject specified Java code fragments into the generated code\n\n\u00a0 -Xlocator\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :\u00a0 enable source location support for generated code\n\n\u00a0 -Xsync-methods\u00a0\u00a0\u00a0\u00a0 :\u00a0 generate accessor methods with the 'synchronized' keyword\n\n\u00a0 -mark-generated\u00a0\u00a0\u00a0 :\u00a0 mark the generated code as @javax.annotation.Generated\n\n\u00a0 -episode &lt;FILE&gt;\u00a0\u00a0\u00a0 :\u00a0 generate the episode file for separate compilation\n\n\u00a0 -Xpropertyaccessors :\u00a0 Use XmlAccessType PROPERTY instead of FIELD for generated classes<\/pre>\n<p>Eigentlich ist bis auf die Angabe der Schema-Quelle (aus einer Datei oder alternativ die URL) keine weitere Angabe n\u00f6tig. Es ist aber praktisch, zwei Optionen zu setzen: -p bestimmt das Java-Paket f\u00fcr die generierten Klassen und -d das Ausgabeverzeichnis, in dem der Generator die erzeugten Dateien ablegt.<\/p>\n<h4>Bibelvers \u00fcber eine Bibel-API beziehen<\/h4>\n<p>F\u00fcr ein Beispiel w\u00e4hlen wir eine freie Bibel-API. Die URL sieht so aus:<\/p>\n<p><em>http:\/\/api.preachingcentral.com\/bible.php?passage=Jn3:16&amp;version=schlachter<\/em><\/p>\n<p>Die Angabe von version ist optional, und bestimmt im gesetzten Fall die Sprache bzw. die Bibel-Ausgabe. Die Seite http:\/\/www.4-14.org.uk\/xml-bible-web-service-api zeigt den Einsatz der einfachen API, bei der ganz simpel in die URL das Buch, Kapitel und Vers steht. F\u00fcr unser Beispiel sieht das Ergebnis so aus:<\/p>\n<pre>&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\n\n&lt;bible&gt;\n\n\u00a0&lt;title&gt;Jn3:16&lt;\/title&gt;\n\n\u00a0&lt;range&gt;\n\n\u00a0 &lt;request&gt;Jn3:16&lt;\/request&gt;\n\n\u00a0 &lt;result&gt;John 3:16&lt;\/result&gt;\n\n\u00a0 &lt;item&gt;\n\n\u00a0\u00a0 &lt;bookname&gt;John&lt;\/bookname&gt;\n\n\u00a0\u00a0 &lt;chapter&gt;3&lt;\/chapter&gt;\n\n\u00a0\u00a0 &lt;verse&gt;16&lt;\/verse&gt;\n\n\u00a0\u00a0 &lt;text&gt;Denn Gott hat die Welt so geliebt, da\u00df er seinen eingeborenen Sohn gab, damit jeder, der an ihn glaubt, nicht verloren gehe, sondern ewiges Leben habe.&lt;\/text&gt;\n\n\u00a0 &lt;\/item&gt;\n\n\u00a0&lt;\/range&gt;\n\n\u00a0&lt;time&gt;0.007&lt;\/time&gt;\n\n&lt;\/bible&gt;<\/pre>\n<p>F\u00fcr unser Beispiel wollen wir das XML-Dokument nicht von Hand auseinanderpfl\u00fccken, sondern JAXB soll uns eine gef\u00fcllte JavaBean mit allen Informationen liefern. Leider gibt es f\u00fcr dieses einfache XML-Format kein XML-Schema, sodass wir uns mit einem Trick behelfen: wir lassen uns von einem Dienst aus der XML-Datei ein Schema generieren, sodass wir damit zu xjc gehen k\u00f6nnen. Es gibt im Internet einige freie XML-nach-Schema-Konverter, zum Beispiel http:\/\/www.xmlforasp.net\/CodeBank\/System_Xml_Schema\/BuildSchema\/BuildXMLSchema.aspx. Das XML-Dokument wird in das Textfeld kopiert und nach dem Knopfdruck \u201eGenerate Schema\u201c folgt:<\/p>\n<pre>&lt;?xml version=\"1.0\" encoding=\"utf-16\"?&gt;\n\n&lt;xsd:schema attributeFormDefault=\"unqualified\" elementFormDefault=\"qualified\" version=\"1.0\" xmlns:xsd=\"http:\/\/www.w3.org\/2001\/XMLSchema\"&gt;\n\n\u00a0 &lt;xsd:element name=\"bible\"&gt;\n\n\u00a0\u00a0\u00a0 &lt;xsd:complexType&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;xsd:sequence&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;xsd:element name=\"title\" type=\"xsd:string\" \/&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;xsd:element name=\"range\"&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;xsd:complexType&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;xsd:sequence&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;xsd:element name=\"request\" type=\"xsd:string\" \/&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;xsd:element name=\"result\" type=\"xsd:string\" \/&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;xsd:element name=\"item\"&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;xsd:complexType&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;xsd:sequence&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;xsd:element name=\"bookname\" type=\"xsd:string\" \/&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;xsd:element name=\"chapter\" type=\"xsd:int\" \/&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;xsd:element name=\"verse\" type=\"xsd:int\" \/&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;xsd:element name=\"text\" type=\"xsd:string\" \/&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/xsd:sequence&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0\u00a0&lt;\/xsd:complexType&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/xsd:element&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/xsd:sequence&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/xsd:complexType&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/xsd:element&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;xsd:element name=\"time\" type=\"xsd:decimal\" \/&gt;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/xsd:sequence&gt;\n\n\u00a0\u00a0\u00a0 &lt;\/xsd:complexType&gt;\n\n\u00a0 &lt;\/xsd:element&gt;\n\n&lt;\/xsd:schema&gt;<\/pre>\n<p>Diese Ausgabe speichern wir in der Datei bible.xsd, damit sie von xjc verwendet werden kann.<\/p>\n<p>Den Aufruf von xjc setzen wir in eine Batch-Datei:<\/p>\n<pre>PATH=%PATH%;C:\\Program Files\\Java\\jdk-9\\bin\n\nxjc -d src\\main\\java -p com.tutego.insel.xml.jaxb.bible bible.xsd<\/pre>\n<p>Das Tool generiert alle Typen f\u00fcr den komplexen Typ aus dem XML-Schema, um eine Paket-Annotation festmachen zu k\u00f6nnen, und ObjectFactory, die einfache Fabrikmethoden enth\u00e4lt, um die gemappten Objekte aufbauen zu k\u00f6nnen. Die Ausgabe vom Programm ist:<\/p>\n<pre>\u2026&gt;xjc -d src\\main\\java -p com.tutego.insel.xml.jaxb.bible bible.xsd\n\nEin Schema wird geparst ...\n\nEin Schema wird kompiliert ...\n\ncom\\tutego\\insel\\xml\\jaxb\\bible\\Bible.java\n\ncom\\tutego\\insel\\xml\\jaxb\\bible\\ObjectFactory.java<\/pre>\n<p>TIPP: In Eclipse l\u00e4sst sich xjc einfach aufrufen. Selektiere im Package-Explorer BIBLE.xsd, im Kontextmen\u00fc Generate \u2022 JAXB Classes\u2026, dann w\u00e4hle das Java-Projekt aus, anschlie\u00dfend Next. Im folgenden Dialog gib als Paket \u201ecom.tutego.insel.xml.jaxb.bible\u201c ein, dann klicke auf Finish. Wichtig! Damit xjc gefunden wird, muss das JDK aktiviert sein, nicht das JRE; nur das JDK bringt das Werkzeug xjc mit.<\/p>\n<p>Dann kann ein Java-Programm den Service mit einer URL ansprechen und sich das Ergebnis-XML in eine JavaBean konvertieren lassen.<\/p>\n<pre>package com.tutego.insel.xml.jaxb;\n\n\n\n\nimport javax.xml.bind.JAXB;\n\nimport com.tutego.insel.xml.jaxb.bible.Bible;\n\n\n\n\npublic class BibleOnline {\n\n\u00a0 public static void main( String[] args ) {\n\n\u00a0\u00a0\u00a0 String url = \"http:\/\/api.preachingcentral.com\/bible.php?passage=Jn3:16&amp;version=schlachter\";\n\n\u00a0\u00a0\u00a0 Bible bible = JAXB.unmarshal( url, Bible.class );\n\n\u00a0\u00a0\u00a0 System.out.println( bible.getRange().getItem().getText() );\n\n\u00a0 }\n\n}<\/pre>\n<p>&nbsp;<\/p>\n<p>WICHTIG\u00a0Das JAXB-Modul muss in Java 9 \u00fcber einen Schalter auf der Kommandozeile hinzugenommen werden:\u00a0&#8211;add-modules java.se.ee.<\/p>\n<h4>Konflikte in der Schema-Datei *<\/h4>\n<p>Leider haben viele XML-Schemas ein Problem, sodass sie nicht direkt vom Schema-Compiler verarbeitet werden k\u00f6nnen. Ein Beispiel zeigt das Dilemma:<\/p>\n<pre>&lt;container&gt;\n \u00a0&lt;head&gt;&lt;content\u00a0title=\"Titel\"\/&gt;&lt;\/head&gt;\n \u00a0&lt;body&gt;&lt;content\u00a0doc=\"doc.txt\"\/&gt;&lt;\/body&gt;\n &lt;\/container&gt;<\/pre>\n<p>In der hierarchischen Struktur hei\u00dft das in &lt;head&gt; und &lt;body&gt; vorkommende XML-Element gleich, n\u00e4mlich content. Die Schema-Datei kann widerspruchslos definieren, dass die beiden XML-Elemente gleich hei\u00dfen, aber unterschiedliche Attribute erlauben, sozusagen das Head-Content und das Body-Content. Allein durch ihre Hierarchie, also dadurch, dass sie einmal unter head und einmal unter body liegen, sind sie eindeutig bestimmt. Der Schema-Compiler von Java bekommt aber Probleme, da er diese hierarchische Information in eine flache bringt. Er kann einfach eine Klasse Head und Body aufbauen, aber bei &lt;content&gt; steht er vor einem Problem. Da die Schema-Definitionen unterschiedlich sind, m\u00fcssten zwei verschiedene Java-Klassen unter dem gleichen Namen Content generiert werden. Das geht nicht, und xjc bricht mit Fehlern ab.<\/p>\n<p>Fehler dieser Art gibt es leider h\u00e4ufig, und sie sind der Grund, warum aus vielen Schemas nicht einfach JavaBeans generiert werden k\u00f6nnen. Erfolglos ohne weitere Einstellungen sind beispielsweise DocBook, Office Open XML, SVG, MathML und weitere. Doch was k\u00f6nnte die L\u00f6sung sein? xjc sieht Konfigurationsdateien vor, die das Mapping anpassen k\u00f6nnen. In diesen Mapping-Dokumenten identifiziert ein XPath-Ausdruck die problematische Stelle und gibt einen Substitutionstyp an. Die Dokumentation auf der JAXB-Homepage weist Interessierte in die richtige Richtung.<\/p>\n<h4>JAXB-Plugins<\/h4>\n<p>Auf der Webseite https:\/\/github.com\/javaee\/jaxb2-commons gibt es eine Reihe n\u00fctzlicher zus\u00e4tzlicher Plugins f\u00fcr JAXB. Zu ihnen geh\u00f6ren:<\/p>\n<ul>\n<li><strong>JAXB2<\/strong> <strong>Basic<\/strong> <strong>Plugins<\/strong>: Diese Plugin-Sammlung besteht aus Equals (erzeugt die equals(\u2026)-Methode, wobei der Gleichheitstest \u00fcber ein Equals-Strategie-Objekt austauschbar ist), HashCode (erzeugt hashCode(), wobei auch hier die Berechnung des Hashwerts \u00fcber ein Strategie-Objekt erfolgt), ToString (erzeugt toString(), auch wieder \u00fcber ein externes ToStringStrategy-Objekt), Copyable (erzeugt copyTo(\u2026), um Objektzust\u00e4nde in ein anderes typkompatibles Objekt zu kopieren, und auch clone(); arbeitet dabei mit CopyStrategie), Mergeable (realisiert mergeFrom(\u2026)-Methoden mit MergeStrategy-Objekten, die Zust\u00e4nde eines anderen Objekts mit den eigenen vereinen), JAXBIndex (generiert eine index-Datei, die alle generierten Schema-Klassen auflistet), Inheritance und AutoInheritance (erlauben JAXB-Beans, globale Elemente oder komplexe Typen von gew\u00fcnschten Basisklassen zu erben oder Schnittstellen zu implementieren), Wildcard (spezifiziert, wie sich das Wildcard-Property verhalten soll), Setters (etwas andere Setter-Implementierung bei Sammlungen) und Simplify Plugin (komplexe Properties in Einzel-Properties aufspalten).<\/li>\n<li><strong>Value-Constructor<\/strong> <strong>Plugin<\/strong>: Jede JavaBean bekommt von xjc nur einen Standard-Konstruktor. Das Plugin gibt einen weiteren Konstruktor hinzu, der alle Attribute direkt initialisiert.<\/li>\n<li><strong>Default<\/strong> <strong>Value<\/strong> <strong>Plugin<\/strong>: Ein XML-Schema kann mit defaultValue vordefinierte Initialbelegungen f\u00fcr Attribute angeben. xjc ignoriert diese. Das Plugin wertet diese Vorbelegungen aus und initialisiert die Attribute der JavaBean gem\u00e4\u00df den Werten.<\/li>\n<li><strong>Fluent<\/strong> <strong>API<\/strong> <strong>Plugin<\/strong>: Anstatt eine Bean nur mit Setter-Aufrufen zu initialisieren, etwa eine Person mit setName(\u2026) und setAge(\u2026), generiert das Fluent API Plugin kaskadierbare Methoden, sodass im Beispiel unserer Person nur new Person().withName(\u2026).withAge(\u2026) zu schreiben ist.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Da es f\u00fcr existierende XML-Dateien m\u00fchselig ist, die annotierten JavaBeans von Hand aufzubauen, gibt es einen Generator, genannt Java Architecture for XML Binding Compiler, kurz xjc. Er kann von der Kommandozeile, von Maven, aus einem Ant-Skript oder auch von Entwicklungsumgebungen aus aufgerufen werden. Er nimmt eine XML-Schema-Datei und generiert die Java-Klassen und eine ObjectFactory, die [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[1,11],"tags":[],"class_list":["post-3878","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3878","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=3878"}],"version-history":[{"count":10,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3878\/revisions"}],"predecessor-version":[{"id":3888,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3878\/revisions\/3888"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=3878"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=3878"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=3878"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}