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 データ構造を理解していなくてもアクセスすることができます。

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

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

サポートされる構成 サポートされる構成: wsimportwsgenschemagen、および xjc コマンド行ツールは、z/OS® プラットフォームではサポートされていません。この機能は、z/OS プラットフォームで稼働する WebSphere® Application Server で提供されるアセンブリー・ツールによって提供されます。 これらのツールについての詳細は、JAX-WS アプリケーションのこれらのコマンド行ツールに関する説明を参照してください。sptcfg
ベスト・プラクティス ベスト・プラクティス: WebSphere Application Server は、Java API for XML-Based Web Services (JAX-WS) および Java Architecture for XML Binding (JAXB) のツールを提供します。wsimportwsgenschemagen、および xjc コマンド行ツールは、WebSphere Application Server traditionalapp_server_root¥bin¥ ディレクトリーにあります。xjc コマンドおよび schemagen コマンド は、Liberty プロファイルの app_server_root¥jaxb¥bin¥ ディレクトリーにあります。 WebSphere Application Server および JDK が提供するツールによって生成される成果物は両方とも、同じレベルの仕様をサポートすることがあります。 一般的に、JDK ツールにより生成される成果物は、 その他の対応しているランタイム環境間で移植可能です。ただし、 WebSphere Application Server 環境内で シームレスな統合を実現して、WebSphere Application Server のみで サポートされる機能を利用するには、この製品で提供されるツールを使用するのがベスト・プラクティスです。JAX-WS および JAXB V2.2 ツールを 利用するには、アプリケーション・サーバーで提供され、 app_server_root¥bin¥ ディレクトリーにある ツールを使用します。bprac
サポートされる構成 サポートされる構成: 本製品は、JAXB 2.2 仕様をサポートしています。JAX-WS 2.2 では、データ・バインディングに JAXB 2.2 が必要です。sptcfg

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 を起動する必要があります。

トラブルの回避 (Avoid trouble) トラブルの回避 (Avoid trouble): schemagen ツールの実行中は、 このスキーマ・ジェネレーターでは、package-info クラス・ファイルから適切に @XmlSchema アノテーションが読み取られず、targetNamespace は派生しません。 @XMLSchema アノテーションを使用する代わりに、以下のいずれかの方法を使用します。
  • @XmlSchema 付きの package-info.java ファイルを指定します。例:
    schemagen sample.Address sample\package-info.java
  • @XmlType アノテーションの名前空間属性を使用して、名前空間を指定します。 例:
    @XmlType(namespace="http://myNameSpace")
gotcha

手順

  1. XML スキーマ・ファイルの生成に使用するために、アノテーションを付けた Java ソース・ファイルまたは Java クラス・ファイルを見つけます。 Java クラス・ファイルにより参照されるすべてのクラスが、クラスパスに含まれているか、または -classpath/-cp オプションを使用してツールに提供されることを確認してください。
  2. JAXB スキーマ・ジェネレーターの schemagen コマンドを使用して XML スキーマを生成します。 スキーマ・ジェネレーターは、 app_server_root¥bin¥ ディレクトリーにあります。
    [Windows]
    app_server_root¥bin¥schemagen.bat myObj1.java myObj2.java
    [AIX][HP-UX][Linux][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. (オプション) javax.xml.bind.annotations パッケージに 定義された JAXB プログラム・アノテーションを使用して、 JAXB XML スキーマ・マッピングをカスタマイズします。
  4. (オプション) @XmlSchema アノテーションで location プロパティーを構成して、スキーマ・コンパイラーに対して、新しいスキーマを生成するのではなく、 既存のスキーマを使用するように指示します。 以下に例を示します。
    @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 インスタンス文書としてマーシャルおよびアンマーシャルする準備ができました。

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

以下の例は、既存の Java クラス Bookdata.java から JAXB ツールが XML スキーマ・ファイルをどのように生成するかを示しています。
  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="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>

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


トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_jaxbjava2schema
ファイル名:twbs_jaxbjava2schema.html