16.1.5 パラメタおよび戻り値からメッセージのパートへのマッピング(wrapperスタイルの場合)
SEIのメソッドのパラメタからWSDL(wsdl:part要素のname属性)へのマッピングについて説明します。
ここでは,wrapperスタイルの場合について説明します。
- 〈この項の構成〉
(1) マッピング
wrapperスタイルの場合,SEIのメソッド名およびSEIのメソッド名と同じ名称のリクエストbeanが生成されます。また,接尾辞"Response"を付加したレスポンスbeanが生成されます。リクエストbeanおよびレスポンスbeanの生成には,hwsgenコマンドで自動生成する方法と,Webサービスの開始時に動的に生成する方法があります。動的に生成する方法の場合は,Webサービスの開始時にエラーが発生しないように,コンパイルしたWebサービス実装クラスに対してhwsgenコマンドを実行することで,事前にエラーチェックができます。詳細については,「10.23.1 hwsgenコマンドによるエラーチェックについて」を参照してください。
メソッドのパラメタとメッセージのパートのマッピング例を次の図に示します。
メソッドの戻り値とメッセージのパートのマッピング例を次の図に示します。
メソッドのパラメタおよび戻り値からメッセージのパートへのマッピング規則を次に示します。
-
パラメタおよび戻り値は,wrapper要素の子要素として空の名前空間("")でマッピングされます。wrapper要素は,SEIと同じ名前空間でマッピングされます。
-
inパラメタおよびinoutパラメタは,argN※という名称でリクエストbeanのプロパティとしてマッピングされます。
-
outパラメタおよびinoutパラメタは,argN※という名称でレスポンスbeanのプロパティとしてマッピングされます。
また,戻り値は,returnという名称で,レスポンスbeanのプロパティとしてマッピングされます。このとき,予約語にならないように,フィールド名の接頭辞にはアンダースコア(_)が付加されます。
-
マッピングされたリクエストbeanおよびレスポンスbeanのプロパティには,javax.xml.bind.annotation.XmlElementアノテーションがアノテートされます。
-
アノテートされたjavax.xml.bind.annotation.XmlElementアノテーションには,リクエストbeanのプロパティではname要素にargN※という名称が,namespace要素に空の名前空間("")が設定されます。レスポンスbeanのプロパティではname要素にreturnという名称が,namespace要素に空の名前空間("")が設定されます。
-
パラメタからWSDLのパートへのマッピングでは,"parameters"という固定値でinputメッセージのパート名にマッピングされます。
-
戻り値からWSDLのパートへのマッピングでは,"parameters"という固定値でoutputメッセージのパート名にマッピングされます。
- 注※
-
argNのNは,パラメタの順番に依存した0以上の整数を表します。
javax.xml.bind.annotation.XmlElementアノテーションについては,「16.2.10 javax.xml.bind.annotation.XmlElementアノテーション」を参照してください。
(2) パラメタに指定できるJava型
Holder(javax.xml.ws.Holder)型以外のJava型と,Holder型を指定するときの条件および注意事項について説明します。
(a) Holder型以外のJava型
Holder型以外のJava型は,JAXB 2.2仕様に従ってWSDLのスキーマの型にマッピングされます。Holder型以外のJava型を指定するときの注意事項について説明します。
-
Javaプリミティブ型は,outおよびinoutパラメタに指定できません。
-
Javaプリミティブ型は,javax.xml.ws.Holderクラスの型パラメタとしても指定できません。指定した場合,javacコマンドの実行時にエラーとなり終了します。
-
Java型をoutおよびinoutパラメタに指定する場合,javax.xml.ws.Holderクラスの型パラメタとして指定できます。
(b) javax.xml.ws.Holder型
javax.xml.ws.Holder型を指定するときの注意事項について説明します。
-
javax.xml.ws.Holderクラスの型パラメタに,javax.jws.WebParamアノテーションを指定する場合,mode要素でMode.OUTまたはMode.INOUTを指定する必要があります。
-
次の場合の動作は保証されません。
-
javax.xml.ws.Holderクラスをメソッドの引数以外に指定した場合
-
javax.xml.ws.Holderクラスの配列を使用した場合
-
javax.xml.ws.Holderクラスの型パラメタに型を指定していない場合
-
javax.xml.ws.Holderクラスの型パラメタに,javax.xml.ws.Holderクラスやそれを継承したクラスを指定した場合
-
Webサービス開始時にリクエストbeanとレスポンスbeanを動的に生成する際,javax.xml.ws.Holderクラスの型パラメタにbyte型以外の多次元配列とbyte型の3次元以上の配列を指定した場合
-
(c) Java型のマッピング
Java型をマッピングするときの注意事項について説明します。
-
javax.jws.WebParamアノテーションのmode要素でカスタマイズしていない場合,javax.xml.ws.Holderクラスの型パラメタ以外の引数は,inパラメタとしてマッピングされ,javax.xml.ws.Holderクラスの型パラメタは,inoutパラメタとしてマッピングされます。outパラメタとしてマッピングする方法については,「16.2.7(4) mode要素(javax.jws.WebParam)」を参照してください。
-
inputメッセージ名は,オペレーション名でマッピングされます。outputメッセージ名は,オペレーション名に接尾辞"Response"を付加した値でマッピングされます。
-
SEIのメソッドのパラメタは,Javaの仕様に従って254個まで定義できます。255個以上定義した場合は,javacコマンドの実行時にコンパイルエラーとなり終了します。
(5) 名前衝突時の動作
wrapper beanクラス名とグローバル要素の名前についての規則,および名前衝突したときの動作について説明します。
-
wrapper beanクラス名
生成されるwrapper beanクラス名は,パッケージ内でユニークな名前である必要があります。ただし,大文字/小文字の違いは無視されます。
すでに存在するクラスと名前が重複していた場合は,上書きされます。ただし,そのクラスがjavacコマンドの引数に含まれていた場合は,javacコマンド実行時にエラーチェックされます。
-
グローバル要素(ローカル名および名前空間)
グローバル要素(ローカル名および名前空間)は,WSDL内でユニークである必要があります。ユニークでない場合の動作は保証されません。
(6) java.util.Mapクラスの使用
SEIの引数または戻り値にjava.util.Mapクラスを使用する場合,SEIのjava.util.Map型の引数または戻り値に対して,次の作業をする必要があります。
-
value typeを作成します。
JAXB 2.2仕様に従い,java.util.Map(bound type)に対応するvalue type(マーシャル/アンマーシャルできるJavaBeanクラス)を作成します。
-
アダプタを作成します。
javax.xml.bind.annotation.adapters.XmlAdapterを継承するjava.util.Map(bound type)およびvalue typeを相互変換するアダプタを作成し,unmarshalメソッドおよびmarshalメソッドを実装します。
-
javax.xml.bind.annotation.adapters.XmlJavaTypeAdapterアノテーションでアノテートします。
java.util.Map型の引数または戻り値を,2.のアダプタを値に持つXmlJavaTypeAdapterアノテーションでアノテートします。
-
javacコマンドを実行します。
アノテート済みのSEIをjavacコマンドでコンパイルします。
value type,アダプタ,xmlJavaTypeAdapterアノテーションが適用されたリクエストbeanクラス/レスポンスbeanクラスの関係と実装例を次に示します。
図16‒6 java.util.Mapの使用例