34.6. 単純型置換

概要

XML では、xsi:type 属性を使用して、互換性のあるタイプ間で単純なタイプの置換が可能になります。ただし、単純型から Java プリミティブ型へのデフォルトのマッピングは、単純型の置換を完全にはサポートしていません。ランタイムは基本的な単純型置換を処理できますが、情報は失われます。コードジェネレーターをカスタマイズして、ロスレスの単純型置換を容易にする Java クラスを生成できます。

デフォルトのマッピングとマーシャリング

Java プリミティブ型は型置換をサポートしていないため、単純型から Java プリミティブ型へのデフォルトのマッピングでは、単純型置換をサポートする際に問題が発生します。型を定義するスキーマで許容される場合でも、int を必要とする変数に short を渡そうとした場合、Java 仮想マシンは動作を止めます。

Java 型システムによって課される制限を回避するために、要素の xsi:type 属性の値が以下のいずれかの条件を満たす場合、Apache CXF は単純型置換を許可します。

  • 要素のスキーマ型と互換性のあるプリミティブ型を指定します。
  • 要素のスキーマタイプから制限によって派生するタイプを指定します。
  • 要素のスキーマタイプから拡張によって派生する複合タイプを指定します。

ランタイムが型置換を処理する場合、要素の xsi:type 属性に指定される型に関する情報が維持されません。型置換が複合型から単純型への場合、単純型に直接関連する値のみが保持されます。拡張機能によって追加された他の要素と属性はすべて失われます。

ロスレスタイプ置換のサポート

単純型の生成をカスタマイズして、次の方法で単純型置換のロスレスサポートを容易にすることができます。

  • globalBindings カスタマイズ要素の mapSimpleTypeDeftrue に設定します。

    これは、グローバルスコープで定義されたすべての名前付き単純型の Java 値クラスを作成するようにコードジェネレーターに指示します。

    詳細は、「単純型の Java クラスの生成」 を参照してください。

  • javaType 要素を globalBindings カスタマイズ要素に追加します。

    これは、XML スキーマプリミティブ型のすべてのインスタンスを特定のクラスのオブジェクトにマップするようにコードジェネレーターに指示します。

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

  • カスタマイズする特定の要素に baseType カスタマイズ要素を追加します。

    baseType カスタム要素を使用すると、プロパティーを表すために生成された Java タイプを指定できます。単純な型の置換に最適な互換性を確保するには、ベースタイプとして java.lang.Object を使用します。

    詳細は、「要素または属性の基本タイプの指定」 を参照してください。