38.6. 要素または属性の基本タイプの指定

概要

場合によっては、要素用に、または XML スキーマ複合型の一部として定義された属性用に生成されたオブジェクトのクラスをカスタマイズする必要があります。たとえば、より一般化されたクラスのオブジェクトを使用して、単純な型置換を可能にすることができます。

これを行う 1 つの方法は、JAXB 基本タイプのカスタマイズを使用することです。これにより、開発者は、ケースバイケースで、要素または属性を表すために生成されたオブジェクトのクラスを指定できます。基本型のカスタマイズにより、XML スキーマ構造と生成された Java オブジェクト間の代替マッピングを指定できます。この代替マッピングは、デフォルトの基本クラスの単純な特殊化または一般化にすることができます。XML スキーマプリミティブ型を Java クラスにマッピングすることもできます。

カスタマイズの使用法

JAXB ベース型のプロパティーを XML スキーマ構造に適用するには、JAXB baseType カスタマイズ要素を使用します。baseType カスタマイズ要素は JAXB property 要素の子であるため、適切にネスティングする必要があります。

XML スキーマ構造の Java オブジェクトへのマッピングをどのようにカスタマイズするかに応じて、baseType カスタマイズ要素の name 属性または javaType 子要素のいずれかを追加します。name 属性は、生成されたオブジェクトのデフォルトクラスを同じクラス階層内の別のクラスにマッピングするために使用されます。javaType 要素は、XML スキーマプリミティブ型を Java クラスにマッピングする場合に使用されます。

重要

同じ baseType カスタマイズ要素で name 属性と javaType 子要素の両方を使用することはできません。

デフォルトのマッピングを特殊化または一般化する

baseType カスタマイズ要素の name 属性は、生成されたオブジェクトのクラスを、同じ Java クラス階層内のクラスに再定義するために使用されます。この属性は、XML スキーマ構造がマップされる Java クラスの完全修飾名を指定します。指定する Java クラスは、コードジェネレーターが XML スキーマ構造用に通常生成する Java クラスのスーパークラスまたはサブクラスのいずれかである 必要 があります。Java プリミティブ型にマップする XML スキーマプリミティブ型の場合、カスタマイズの目的で、ラッパークラスがデフォルトの基本クラスとして使用されます。

たとえば、xsd:int として定義された要素は、java.lang.Integer をデフォルトのベースクラスとして使用します。name 属性の値には、Number または Object など Integer のスーパークラスを指定できます。

単純型置換の場合、最も一般的なカスタマイズは、プリミティブ型を Object オブジェクトにマッピングすることです。

例38.27「基本タイプのインラインカスタマイズ」に、複合型の 1 つの要素を Java Object オブジェクトにマッピングするインラインカスタマイズを示します。

例38.27 基本タイプのインラインカスタマイズ

<complexType name="widgetOrderInfo">
  <all>
    <element name="amount" type="xsd:int" />
     <element name="shippingAdress" type="Address">
      <annotation> <appinfo> <jaxb:property> <jaxb:baseType name="java.lang.Object" /> </jaxb:property> </appinfo> </annotation>
    </element>
    <element name="type" type="xsd:string"/>
  </all>
</complexType>

例38.28「基本タイプをカスタマイズするための外部バインディングファイル」 は、例38.27「基本タイプのインラインカスタマイズ」 に示されているカスタマイズ用の外部バインディングファイルを示しています。

例38.28 基本タイプをカスタマイズするための外部バインディングファイル

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:xsd="http://www.w3.org/2001/XMLSchema"
               jaxb:version="2.0">
  <jaxb:bindings schemaLocation="enumMap.xsd">
    <jaxb:bindings node="xsd:ComplexType[@name='widgetOrderInfo']">
      <jaxb:bindings node="xsd:element[@name='shippingAddress']">
        <jaxb:property>
          <jaxb:baseType name="java.lang.Object" />
        </jaxb:property>
      </jaxb:bindings>
    </jaxb:bindings>
  </jaxb:bindings>
<jaxb:bindings>

結果の Java オブジェクトの @XmlElement アノテーションには type プロパティーが含まれます。type プロパティーの値は、生成されるオブジェクトのデフォルトベース型を表すクラスオブジェクトです。XML スキーマプリミティブ型の場合、クラスは対応する Java プリミティブ型のラッパークラスです。

例38.29「基本クラスが変更された Java クラス」 は、例38.28「基本タイプをカスタマイズするための外部バインディングファイル」 のスキーマ定義に基づいて生成されたクラスを示しています。

例38.29 基本クラスが変更された Java クラス

public class WidgetOrderInfo {

    protected int amount;
    @XmlElement(required = true)
    protected String type;
    @XmlElement(required = true, type = Address.class) protected Object shippingAddress;

    ...
    public Object getShippingAddress() {
        return shippingAddress;
    }

    public void setShippingAddress(Object value) {
        this.shippingAddress = value;
    }

}

javaType での使用

javaType 要素は、XML スキーマのプリミティブ型を使用して定義された要素と属性をどのように Java オブジェクトにマッピングするかをカスタマイズするのに使用できます。javaType 要素を使用すると、単に baseType 要素の name 属性を使用するよりも柔軟性が高くなります。javaType 要素を使用すると、プリミティブ型をオブジェクトの任意のクラスにマッピングすることができます。

javaType 要素の使用の詳細な説明は、「XML スキーマプリミティブの Java クラスの指定」を参照してください。