16.1.10 JavaからWSDLへのマッピングに関する注意事項
JavaからWSDLへのマッピングでの注意事項について説明します。
(1) ジェネリクスの型削除
JavaBean(リクエストbean,レスポンスbean,フォルトbean)生成時には,ジェネリクスの型が削除されます。ジェネリクスの型削除の例を次の表に示します。
型削除前 |
型削除後 |
---|---|
T※ |
NumbersData |
List<E> |
List<java.lang.Object> |
List<? extends NumbersData> |
List<NumbersData> |
List<? super NumbersData> |
List< java.lang.Object > |
Map<K, V> |
Map< java.lang.Object, java.lang.Object > |
Map<? extends NumbersKey, ? extends NumbersData> |
Map<NumbersKey, NumbersData> |
Map<? super NumbersKey, ? super NumbersData> |
Map< java.lang.Object, java.lang.Object > |
Iterator<E> |
Iterator< java.lang.Object > |
Iterator<? extends NumbersData> |
Iterator<NumbersData> |
Iterator<? super NumbersData> |
Iterator< java.lang.Object > |
List<List<? extends NumbersData>> |
List<List<NumbersData> |
メソッド引数や戻り値をjavax.jws.WebParamやjavax.jws.WebResultアノテーションでカスタマイズしている場合も,ジェネリクスの型は削除されます(カスタマイズも有効)。また,メソッド引数や戻り値がwrapperスタイルであっても,ジェネリクスの型は削除されます。なお,メソッド引数や戻り値がnon-wrapperスタイルの場合にはジェネリクスの型は削除されません。
(2) JAXBアノテーションのサポートについて
Application ServerのJAX-WS機能は,JAX-WS 2.2仕様のComformance 3.14に対応しています。コマンド実行時には,必要に応じて次に示すJAXBアノテーションが解釈されます。
-
javax.xml.bind.annotation.XmlAttachmentRef
-
javax.xml.bind.annotation.XmlList
-
javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter
-
javax.xml.bind.annotation.XmlMimeType
Application ServerのJAX-WS機能ではMIMEバインディングはサポートされません。
Application ServerのJAX-WS機能が提供するアノテーションプロセッサでは,javax.xml.bind.annotation.XmlListアノテーションはwrapperスタイルの場合には解釈されますが,non-wrapperスタイルの場合には解釈されません。
これらのJAXBアノテーションで,SEIおよびサービス実装クラス以外の引数や戻り値をアノテートした場合の動作は保証されません。
Application ServerのJAX-WS機能が提供するアノテーションプロセッサでは,javax.xml.bind.annotation.XmlJavaTypeAdapterアノテーションおよびjavax.xml.bind.annotation.XmlMimeTypeアノテーションは,SEIまたはサービス実装クラスの引数や戻り値,またはJavaBeanのフィールドをアノテートした場合に解釈されます。パッケージや,インタフェース,またはクラスをアノテートした場合の動作は保証されません。
開発したWebサービスを呼び出すときに,Webサービスの引数や戻り値のサブクラスを使用するとエラーが発生します。正常に呼び出すには,SEIおよびWebサービス実装クラスを定義するときに,javax.xml.bind.annotation.XmlSeeAlsoアノテーションによってサブクラスを関連づける必要があります。
(4) ジェネリクスを使用したクラスまたはインタフェースの使用について
サービス実装クラスは,型変数をパラメタ化したクラスまたはインタフェースを継承できません。継承する場合,サービス実装クラスで再定義したメソッドにexclude要素の要素値が"true"のjavax.jws.WebMethodアノテーションをアノテートしてサービスメソッドから除外する必要があります。
型変数をパラメタ化したクラスまたはインタフェースを継承したサービス実装クラスをコンパイルすると,サービス実装クラス内で再定義したメソッド名と同じ名前の合成ブリッジ・メソッド(synthetic bridge methods)をJDKのコンパイラが暗黙的に生成します。コンパイルしたサービス実装クラスから生成したメタデータ(WSDL)にはユニークでなければならないオペレーション名を2つマッピングすることになるため,メタデータ(WSDL)の解析に失敗します。オペレーション名のマッピングについては,「16.1.4 SEIのメソッド名からオペレーションへのマッピング」を参照してください。