Menu Close

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 クラスの指定」を参照してください。