36.2. XML スキーマ anyType タイプの使用
概要
XML スキーマ型 xsd:anyType
は、すべての XML スキーマ型のルート型です。すべてのプリミティブは、すべてのユーザー定義の複合型と同様に、この型の派生物です。その結果、xsd:anyType
として定義された要素には、XML スキーマプリミティブの形式に加えてスキーマドキュメントで定義された複合型のデータが含まれます。
Java では、最も近い一致する型は Object
クラスです。これは、他のすべての Java クラスがサブタイプ化されるクラスです。
XML スキーマでの使用
xsd:anyType
型は、他の XML スキーマ複合型と同様に使用します。element
要素の type
要素の値として使用することができます。他のタイプを定義する基本タイプとしても使用できます。
例36.5「ワイルドカード要素を持つ複合型」 に、xsd:anyType
型の要素が含まれる複合型の例を示します。
例36.5 ワイルドカード要素を持つ複合型
<complexType name="wildStar">
<sequence>
<element name="name" type="xsd:string" />
<element name="ship" type="xsd:anyType" />
</sequence>
</complexType>
Java へのマッピング
xsd:anyType
型の要素は、Object
オブジェクトにマッピングされます。例36.6「ワイルドカード要素の Java 表現」 は、Java クラスへの 例36.5「ワイルドカード要素を持つ複合型」 のマッピングを示しています。
例36.6 ワイルドカード要素の Java 表現
public class WildStar { @XmlElement(required = true) protected String name; @XmlElement(required = true) protected Object ship; public String getName() { return name; } public void setName(String value) { this.name = value; } public Object getShip() { return ship; } public void setShip(Object value) { this.ship = value; } }
このマッピングにより、ワイルドカード要素を表すプロパティーに任意のデータを配置できます。Apache CXF ランタイムは、データのマーシャリングとアンマーシャリングを処理して、使用可能な Java 表現にします。
マーシャリング
Apache CXF が XML データを Java 型にマーシャリングする場合、anyType
要素を既知の JAXB オブジェクトにマーシャリングしようとします。anyType
要素を JAXB で生成されたオブジェクトにマーシャリングできるかどうかを判断するために、ランタイムは要素の xsi:type
属性を調べて、要素内のデータ構築に使用される実際の型を判断します。xsi:type
属性が存在しない場合、ランタイムは、イントロスペクションによって要素の実際のデータ型の特定を試みます。要素の実際のデータ型が、アプリケーションの JAXB コンテキストで認識されている型の 1 つであると判断された場合、要素は適切な型の JAXB オブジェクトにマーシャリングされます。
ランタイムが要素の実際のデータタイプを判別できない場合や、要素の実際のデータ型が既知のタイプではない場合、ランタイムはコンテンツを org.w3c.dom.Element
オブジェクトにマーシャルします。次に、DOM APis を使用して要素のコンテンツを操作する必要があります。
アプリケーションのランタイムは通常、そのコントラクトに含まれるスキーマから生成されたすべてのタイプを認識しています。これには、コントラクトの wsdl:types
要素で定義されたタイプ、包含によりコントラクトに追加されたデータタイプ、他のスキーマドキュメントのインポートによりコントラクトに追加されたすべてのタイプが含まれます。「ランタイムマーシャラーへのクラスの追加」 で説明される @XmlSeeAlso
アノテーションを使用して、追加の型をランタイムを認識させることもできます。
アンマーシャリング
Apache CXF が Java タイプを XML データにアンマーシャリングする場合、Java データタイプとそれらが表す XML スキーマ構造との間の内部マップを使用して、ワイヤに書き込む XML 構造を決定します。ランタイムがクラスを認識し、クラスを XML スキーマ構造にマッピングできる場合は、データを書き出して xsi:type
属性を挿入し、要素に含まれるデータの型を特定します。データが org.w3c.dom.Element
オブジェクトに保存されている場合、ランタイムはオブジェクトによって表される XML 構造を書き込みますが、xsi:type
属性は含まれません。
ランタイムが Java オブジェクトを既知の XML スキーマ構造にマップできない場合、マーシャリング例外が出力されます。「ランタイムマーシャラーへのクラスの追加」 で説明されている @XmlSeeAlso
アノテーションを使用して、ランタイムのマッピングに型を追加できます。