JAXB schemagen ツールを使用して Java クラスから XML スキーマ ファイルを生成する

Java™ Architecture for XML Binding (JAXB) schemagen ツールを使用して、Java クラスから XML スキーマ ファイルを生成します。

事前処理

XML スキーマ ファイルにマップする Java クラスまたは Java オブジェクトのセットを識別します。

このタスクの概要

JAXB API とツールを使用して、Java クラスと XML スキーマ間のマッピングを確立します。 XML スキーマ文書は、XML 文書内のデータ・エレメントと関係を記述します。 データ・マッピングまたはバインディングが存在するようになったら、 XML 文書と Java オブジェクトとの間で双方向に変換できます。 XML 文書に保管されているデータには、XML データ構造を理解していなくてもアクセスすることができます。

既存のものからボトムアップ開発アプローチを使用してWebサービスを開発するJavaBeansまたはエンタープライズBeanの場合は、wsgen Java API for XML-Based Web Services (JAX-WS) アプリケーションの成果物を生成するツール。 アプリケーションのJava成果物が生成されたら、JAXBスキーマジェネレータを使用して、既存のJavaアプリケーションからJavaアプリケーションのデータ要素を表すXMLスキーマドキュメントを作成できます。schemagenコマンドラインツール。 JAXB スキーマ ジェネレーターは、Java ソース ファイルまたはクラス ファイルのいずれかを処理します。 Java クラス アノテーションは、既存の Java クラスから生成されたスキーマ コンポーネントへのデフォルトのマッピングをカスタマイズする機能を提供します。 XML スキーマ ファイルと注釈付き Java クラス ファイルには、JAXB ランタイムが XML ドキュメントを解析してマーシャリングおよびアンマーシャリングするために必要なすべての情報が含まれています。

JAXBスキーマジェネレータを使用して、Javaアプリケーションのデータ要素を表す既存のJavaアプリケーションからXMLスキーマドキュメントを作成できます。schemagenコマンドラインツール。 JAXB スキーマ ジェネレーターは、Java ソース ファイルまたはクラス ファイルのいずれかを処理します。 Java クラス アノテーションは、既存の Java クラスから生成されたスキーマ コンポーネントへのデフォルトのマッピングをカスタマイズする機能を提供します。 XML スキーマ ファイルと注釈付き Java クラス ファイルには、JAXB ランタイムが XML ドキュメントを解析してマーシャリングおよびアンマーシャリングするために必要なすべての情報が含まれています。

サポートされている構成:wsimportwsgenschemagenそしてxjcコマンドラインツールはサポートされていませんz/OS®プラットホーム。 この機能は、付属のアセンブリツールによって提供されます。 WebSphere® Application Server実行中z/OSプラットホーム。 JAX-WS アプリケーションのこれらのコマンド行ツールについて詳しくは、これらのツールに関する説明を参照してください。
ベストプラクティス:WebSphere Application ServerXML ベースの Web サービス用の Java API (JAX-WS) と XML バインディング用の Java アーキテクチャ (JAXB) ツールを提供します。 完全プロファイルで、wsimportwsgenschemagen、および xjc のコマンド行ツールは、app_server_root\bin\ ディレクトリーにあります。 Liberty プロファイルで、wsimport コマンドと wsgen コマンドは、 app_server_root\jaxws\bin\ ディレクトリーにあります。 のxjcそしてschemagenコマンドはアプリケーションサーバールートLiberty プロファイルの \jaxb\bin\ ディレクトリ。 同様のツールは、Java SE 開発キット (JDK) 6 でも提供されています。 場合によっては、 WebSphere Application ServerJDK は同じレベルの仕様をサポートします。 一般的に、JDK ツールにより生成される成果物は、対応している他のランタイム環境間で移植可能です。 ただし、この製品に付属のツールを使用することで、 WebSphere Application Server環境と、サポートされていない機能を活用するためにWebSphere Application Server。 JAX-WS および JAXB V2.2 ツールを利用するには、app_server_root¥bin¥ ディレクトリーにあるアプリケーション・サーバー提供のツールを使用します。
サポートされている構成:この製品はJAXBをサポートしています2.2仕様。 JAX-WS 2.2 では、データ・バインディングに JAXB 2.2 が必要です。

JAXB ではコンパイルがサポートされていて、 新しいスキーマを自動的に生成しないように schemagen スキーマ・ジェネレーター を構成できるようになっています。 このため、World Wide Web Consortium (W3C)、XML スキーマ、Web サービス記述言語 (WSDL)、または WS アドレス指定などの共通スキーマを使用しているときに、参照される特定のパッケージ用に新しいスキーマを生成せずに済みます。 @XmlSchema アノテーションのロケーション属性を使用すると、schemagen スキーマ・ジェネレーターは、 新しいスキーマを生成する代わりに、既存のスキーマの URI を参照するようになります。

コマンド行から schemagen ツールを使用する以外にも、 この JAXB ツールを Ant ビルド環境内で起動することができます。 Ant ビルド環境内で com.sun.tools.jxc.SchemaGenTask Ant タスクを使用して schemagen スキーマ・ジェネレーター・ツールを起動します。 この Ant タスクが正しく作動するようにするには、 ws_ant スクリプトを使用して Ant を起動する必要があります。

トラブルを避ける:実行中はschemagenツールでは、スキーマジェネレーターは@XmlSchemaパッケージ情報クラスファイルから派生する注釈targetNamespaces。 @XMLSchema アノテーションを使用する代わりに、以下のいずれかの方法を使用します。
  • @XmlSchema 付きの package-info.java ファイルを指定します。例:
    schemagen sample.Address sample\package-info.java
  • @XmlType アノテーションの名前空間属性を使用して、名前空間を指定します。 例:
    @XmlType(namespace="http://myNameSpace")

手順

  1. XML スキーマ ファイルの生成に使用する Java ソース ファイルまたは Java クラス ファイルを見つけます。
    Javaクラスファイルによって参照されるすべてのクラスがクラスパスに含まれているか、または-classpath/-cpオプション。
  2. JAXBスキーマジェネレータを使用する。schemagen XML スキーマを生成するコマンド。
    スキーマジェネレーターは、アプリケーションサーバールート\bin\ ディレクトリ。
    [Windows]
    app_server_root\bin\schemagen.bat myObj1.java myObj2.java
    [Linux][AIX][HP-UX][Solaris]
    app_server_root/bin/schemagen.sh myObj1.java myObj2.java
    [IBM i]
    app_server_root/bin/schemagen myObj1.java myObj2.java

    パラメータは、myObj1.javaそしてmyObj2.javaは、データ オブジェクトを含む Java ファイルの名前です。 もしmyObj1.javaまたはmyObj2.javaに渡されないJavaクラスを参照しますschemagenコマンドを使用するには、-cpこれらの Java クラスのクラスパスの場所を指定するオプション。

    schemagen コマンドについてと指定できるその他のオプションの詳細については、schemagen コマンドを参照してください。
  3. (オプション)JAXBプログラムアノテーションを使用して、javax.xml.bind.annotations JAXB XML スキーマ マッピングをカスタマイズするためのパッケージ。
  4. (オプション)location不動産@XmlSchema新しいスキーマを生成するのではなく、既存のスキーマを使用するようにスキーマ コンパイラに指示するアノテーション。
    例:
    @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" は、既存のスキーマのロケーションを schemagen ツールに示し、 新しいスキーマは生成されません。

結果

Java クラスから XML スキーマ ファイルを生成したので、Java オブジェクトを XML インスタンス ドキュメントとしてマーシャリングおよびアンマーシャリングする準備が整いました。

トラブルを避ける: schemagen コマンドは、異なる Java パッケージ内で定義された同じ @XMLType 名を持つ複数の @XMLType アノテーション間の XML 名前空間を区別しません。 このシナリオが発生すると、 以下のエラーが出力されます。
エラー: Two classes have the same XML type name ....
Use @XmlType.name and @XmlType.namespace to assign different names to them...
このエラーはクラス名または@があることを示しますXMLType.name同じ名前を持つが異なる Java パッケージ内に存在する値。 このエラーを回避するには、既存の @XMLType アノテーションに @XML.Type.namespace クラスを追加して、XML タイプを区別します。

次の例は、JAXBツールが既存のJavaクラスからXMLスキーマファイルを生成する方法を示しています。Bookdata.java 。
  1. 以下の Bookdata.java ファイルを一時ディレクトリーにコピーします。
    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. コマンド・プロンプトを開きます。
  3. Bookdata.java ファイルをコピーしたディレクトリーから schemagen スキーマ・ジェネレーター・ツールを実行します。
    [Windows]
    app_server_root\bin\schemagen.bat Bookdata.java
    [Linux][AIX][HP-UX][Solaris]
    app_server_root/bin/schemagen.sh Bookdata.java 
    [IBM i]
    app_server_root/bin/schemagen Bookdata.java
  4. XML スキーマ・ファイル schema1.xsd が生成されます。
    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <xs:schema version="1.0" xmlns:xs="https://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>
    

schemagen コマンドについて詳しくは、 JAXB Reference implementation の資料を参照してください。