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