Mit JAXB-schemagen-Tools eine XML-Schemadatei aus einer Java-Klasse generieren

Verwenden Sie die JAXB-schemagen-Tools (Java™ Architecture for XML Binding), um eine XML-Schemadatei aus Java-Klassen zu generieren.

Vorbereitende Schritte

Identifizieren Sie die Java-Klassen oder eine Gruppe von Java-Objekten, die Sie einer XML-Schemadatei zuordnen möchten.

Informationen zu diesem Vorgang

Verwenden Sie die JAXB-APIs und -Tools, um die Zuordnungen zwischen Java-Klassen und dem XML-Schema zu erstellen. In XML-Schemadokumenten werden die Datenelemente und Beziehungen in einem XML-Dokument beschrieben. Wenn eine Datenzuordnung oder -bindung vorhanden ist, können Sie XML-Dokumente in Java-Objekte und umgekehrt konvertieren. Anschließend können Sie auf die in einem XML-Dokument gespeicherten Daten zugreifen, ohne die Datenstruktur verstehen zu müssen.

Zum Entwickeln von Web-Services in einem Bottom-up-Entwicklungsansatz aus vorhandenen JavaBeans oder Enterprise-Beans verwenden Sie das Tool wsgen, um die Artefakte für JAX-WS-Anwendungen (Java API for XML-Based Web Services) zu generieren. Nachdem Sie die Java-Artefakte für Ihre Anwendung generiert haben, können Sie ein XML-Schemadokument aus einer vorhandenen Java-Anwendung erstellen, das die Datenelemente einer Java-Anwendung mithilfe des JAXB-Schemagenerators (Befehlszeilentool schemagen) darstellt. Der JAXB-Schemagenerator verarbeitet Java-Quellendateien oder -Klassendateien. Annotationen für Java-Klassen bieten die Möglichkeit, die Standardzuordnungen von vorhandenen Java-Klassen zu den generierten Schemakomponenten anzupassen. Die XML-Schemadatei und die annotierten Java-Klassendateien enthalten alle erforderlichen Informationen, die die JAXB-Laufzeitumgebung benötigt, um die XML-Dokumente für Marshaling und Unmarshaling syntaktisch zu analysieren.

Sie können ein XML-Schemadokument aus einer vorhandenen Java-Anwendung generieren, das die Datenelemente einer Java-Anwendung darstellt. Hierfür verwenden Sie den JAXB-Schemagenerator, das Befehlszeilentool schemagen. Der JAXB-Schemagenerator verarbeitet Java-Quellendateien oder -Klassendateien. Annotationen für Java-Klassen bieten die Möglichkeit, die Standardzuordnungen von vorhandenen Java-Klassen zu den generierten Schemakomponenten anzupassen. Die XML-Schemadatei und die annotierten Java-Klassendateien enthalten alle erforderlichen Informationen, die die JAXB-Laufzeitumgebung benötigt, um die XML-Dokumente für Marshaling und Unmarshaling syntaktisch zu analysieren.

Unterstützte Konfigurationen Unterstützte Konfigurationen: Die Befehlszeilentools wsimport, wsgen, schemagen und xjc werden auf der Plattform z/OS nicht unterstützt. Diese Funktionalität wird von den Assembliertools, die in der z/OS-Version von WebSphere Application Server enthalten sind, bereitgestellt. Weitere Informationen zur Verwendung dieser Befehlszeilentools für JAX-WS-Anwendungen finden Sie in der Dokumentation zu diesen Tools.sptcfg
Bewährtes Verfahren Bewährtes Verfahren: WebSphere Application Server stellt Tools für Java API for XML-Based Web Services (JAX-WS) und Java Architecture for XML Binding (JAXB) bereit. Die Befehlszeilentools wsimport, wsgen, schemagen und xjc befinden sich im Verzeichnis "Stammverzeichnis_des_Anwendungsservers\bin\" von WebSphere Application Server Traditional. Die Befehle xjc und schemagen befinden sich im Verzeichnis Stammverzeichnis_des_Anwendungsservers\jaxb\bin\ im Liberty-Profil. In einigen Fällen unterstützen die von den WebSphere Application Server-Tools und den JDK-Tools generierten Artefakte dieselben Spezifikationsstufen. Im Allgemeinen sind die von den JDK-Tools generierten Artefakte in kompatible Laufzeitumgebungen portierbar. Es empfiehlt sich jedoch, die WebSphere-Tools zu verwenden, um eine nahtlose Integration in die Umgebung von WebSphere Application Server zu erreichen und die Features zu nutzen, die möglicherweise nur in WebSphere Application Server unterstützt werden. Um den Vorteil der JAX-WS- und JAXB-V2.2-Tools zu nutzen, verwenden Sie die mit Application Server bereitgestellten Tools, die sich im Verzeichnis Stammverzeichnis_des_Anwendungsservers\bin\ befinden.bprac
Unterstützte Konfigurationen Unterstützte Konfigurationen: Dieses Produkt unterstützt die Spezifikation JAXB 2.2. JAX-WS 2.2 erfordert JAXB 2.2 für die Datenbindung. sptcfg

JAXB vorgenommenen bietet Kompilierungsunterstützung, um Ihnen zu ermöglichen, den Schemagenerator schemagen so zu konfigurieren, dass er nicht automatisch ein neues Schema generiert. Diese Verbesserung ist nützlich, wenn Sie ein einheitliches Schema wie World Wide Web Consortium (W3C), XML Schema, Web Services Description Language (WSDL) oder WS-Addressing verwenden und kein neues Schema für ein bestimmtes referenziertes Paket generiert werden soll. Das Attribut location in der Annotation "@XmlSchema" bewirkt, dass der Generator "schemagen" auf den URI des vorhandenen Schemas verweist, anstatt ein neues Schema zu generieren.

Sie können das JAXB-Tool schemagen nicht nur über die Befehlszeile aufrufen, sondern auch in Ant-Build-Umgebungen. Verwenden Sie die Ant-Task com.sun.tools.jxc.SchemaGenTask in der Ant-Build-Umgebung, um das Schemageneratortool schemagen aufzurufen. Damit diese Ant-Task richtig ausgeführt wird, müssen Sie Ant mit dem Script "ws_ant" aufrufen.

Fehler vermeiden Fehler vermeiden: Wenn Sie das Tool schemagen ausführen, liest der Schemagenerator die @XmlSchema-Annotationen aus der Klassendatei "package-info" nicht ordnungsgemäß, um targetNamespace-Objekte abzuleiten. Verwenden Sie an Stelle der Annotation "@XMLSchema" eine der folgenden Methoden:
  • Stellen Sie eine Datei "package-info.java" mit der Annotation "@XmlSchema" bereit, z. B.:
    schemagen sample.Address sample\package-info.java
  • Verwenden Sie das Attribut "namespace" der Annotation "@XmlType" an, um einen Namespace anzugeben, z. B.:
    @XmlType(namespace="http://myNameSpace")
gotcha

Vorgehensweise

  1. Suchen Sie die Java-Quelldateien bzw. Java-Klassendateien, die für die Generierung einer XML-Schemadatei verwendet werden sollen. Vergewissern Sie sich, dass alle von Ihren Java-Klassendateien referenzierten Klassen im Klassenpfad enthalten sind oder dem Tool über die Parameter -classpath/-cp bereitgestellt werden.
  2. Verwenden Sie den JAXB-Schemagenerator, den Befehl schemagen, um ein XML-Schema zu generieren. Der Schemagenerator befindet sich im Verzeichnis Stammverzeichnis_des_Anwendungsservers\bin\.
    [Windows]
    Stammverzeichnis_des_Anwendungsservers\bin\schemagen.bat myObj1.java myObj2.java
    [AIX][HP-UX][Linux][Solaris]
    Stammverzeichnis_des_Anwendungsservers/bin/schemagen.sh myObj1.java myObj2.java
    [IBM i]
    Stammverzeichnis_des_Anwendungsservers/bin/schemagen myObj1.java myObj2.java

    Die Parameter myObj1.java und myObj2.java sind die Namen der Java-Dateien, die die Datenobjekte enthalten. Wenn myObj1.java oder myObj2.java auf Java-Klassen verweist, die nicht an den Befehl schemagen übergeben werden, müssen Sie die Klassenpfadposition dieser Java-Klassen mit dem Parameter -cp angeben.

    Lesen Sie die Dokumentation zum Befehl schemagen, um mehr über diesen Befehl und die zusätzlichen Parameter zu erfahren, die Sie angeben können.
  3. (Optional) Verwenden Sie die im Paket javax.xml.bind.annotations definierten JAXB-Programmannotationen, um die JAXB-XML-Schemazuordnungen anzupassen.
  4. (Optional) Konfigurieren Sie die Eigenschaft location in der Annotation "@XmlSchema", um den Schemacompiler anzuweisen, ein vorhandenes Schema zu verwenden, anstatt ein neues zu generieren. Beispiel:
    @XmlSchema(namespace="foo")
    package foo;
    @XmlType
    class Foo {
    @XmlElement Bar zot;
    }
    @XmlSchema(namespace="bar",
    location="http://example.org/test.xsd")
    package bar;
    @XmlType
    class Bar {
    ...
    }
    <xs:schema targetNamespace="foo">
    <xs:import namespace="bar"
    schemaLocation="http://example.org/test.xsd"/>
    <xs:complexType name="foo">
    <xs:sequence>
    <xs:element name="zot" type="bar:Bar" xmlns:bar="bar"/>
    </xs:sequence>
    </xs:complex
    location="http://example.org/test.xsd" gibt die Position des vorhandenen Schema für das Tool schemagen an. Es wird kein neues Schema generiert.

Ergebnisse

Sie haben eine XML-Schemadatei aus Java-Klassen generiert. Jetzt können Sie das Marshaling und Unmarshaling für die Java-Objekte als XML-Instanzdokumente ausführen.

Fehler vermeiden Fehler vermeiden: Der Befehl "schemagen" unterscheidet beim XML-Namespace nicht zwischen mehreren @XMLType-Annotationen, für die derselbe @XMLType-Name in verschiedenen Java-Paketen definiert ist. Tritt dieser Fall ein, wird die folgende Fehlernachricht angezeigt:
Error: Two classes have the same XML type name ....
Use @XmlType.name and @XmlType.namespace to assign different names to them...
Diese Fehlernachricht zeigt an, dass Sie Klassennamen oder @XMLType.name-Werte mit demselben Namen haben, die sich jedoch in verschiedenen Java-Paketen befinden. Fügen Sie zur Vermeidung dieses Fehlers die Klasse "@XML.Type.namespace" zur vorhandenen Annotation "@XMLType" hinzu, um die Unterscheidung zwischen den XML-Typen zu ermöglichen. gotcha

Beispiel

Das folgende Beispiel veranschaulicht, wie Sie mit den JAXB-Tools eine XML-Schemadatei aus der vorhandenen Java-Klasse "Bookdata.java" generieren.
  1. Kopieren Sie die folgende Datei Bookdata.java in ein temporäres Verzeichnis.
    package generated;
    
    import javax.xml.bind.annotation.XmlAccessType;
    import javax.xml.bind.annotation.XmlAccessorType;
    import javax.xml.bind.annotation.XmlAttribute;
    import javax.xml.bind.annotation.XmlElement;
    import javax.xml.bind.annotation.XmlType;
    import javax.xml.datatype.XMLGregorianCalendar;
    
    
    
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "bookdata", propOrder = {
        "author",
        "title",
        "genre",
        "price",
        "publishDate",
        "description"
    })
    public class Bookdata {
    
        @XmlElement(required = true)
        protected String author;
        @XmlElement(required = true)
        protected String title;
        @XmlElement(required = true)
        protected String genre;
        protected float price;
        @XmlElement(name = "publish_date", required = true)
        protected XMLGregorianCalendar publishDate;
        @XmlElement(required = true)
        protected String description;
        @XmlAttribute
        protected String id;
    
         public String getAuthor() {
            return author;
        }
        public void setAuthor(String value) {
            this.author = value;
        }
        public String getTitle() {
            return title;
        }
    
         public void setTitle(String value) {
            this.title = value;
        }
    
      
        public String getGenre() {
            return genre;
        }
       
        public void setGenre(String value) {
            this.genre = value;
        }
    
        
        public float getPrice() {
            return price;
        }
    
        
        public void setPrice(float value) {
            this.price = value;
        }
    
       
        public XMLGregorianCalendar getPublishDate() {
            return publishDate;
        }
    
        
        public void setPublishDate(XMLGregorianCalendar value) {
            this.publishDate = value;
        }
    
       
        public String getDescription() {
            return description;
        }
    
        
        public void setDescription(String value) {
            this.description = value;
        }
    
       
        public String getId() {
            return id;
        }
    
        
        public void setId(String value) {
            this.id = value;
        }
    
    }
  2. Öffnen Sie eine Eingabeaufforderung.
  3. Führen Sie das Schemageneratortool "schemagen" in dem Verzeichnis aus, in das Sie die Datei Bookdata.java kopiert haben.
    [Windows]
    Stammverzeichnis_des_Anwendungsservers\bin\schemagen.bat Bookdata.java
    [Linux][AIX][HP-UX][Solaris]
    Stammverzeichnis_des_Anwendungsservers/bin/schemagen.sh Bookdata.java 
    [IBM i]
    Stammverzeichnis_des_Anwendungsservers/bin/schemagen Bookdata.java
  4. Die XML-Schemadatei schema1.xsd wird generiert:
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
      <xs:complexType name="bookdata">
        <xs:sequence>
          <xs:element name="author" type="xs:string"/>
          <xs:element name="title" type="xs:string"/>
          <xs:element name="genre" type="xs:string"/>
          <xs:element name="price" type="xs:float"/>
          <xs:element name="publish_date" type="xs:anySimpleType"/>
          <xs:element name="description" type="xs:string"/>
        </xs:sequence>
        <xs:attribute name="id" type="xs:string"/>
      </xs:complexType>
    </xs:schema>

Weitere Informationen zum Befehl schemagen finden Sie in der Dokumentation zu einer Referenzimplementierung von JAXB.


Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxbjava2schema
Dateiname:twbs_jaxbjava2schema.html