16.1.5 パラメタおよび戻り値からメッセージのパートへのマッピング(wrapperスタイルの場合)
(1) マッピング
wrapperスタイルの場合,SEIのメソッド名およびSEIのメソッド名と同じ名称のリクエストbeanが生成されます。また,接尾辞"Response"を付加したレスポンスbeanが生成されます。リクエストbeanおよびレスポンスbeanの生成には,cjaptコマンドまたはcjwsgenコマンドで自動生成する方法と,Webサービスの開始時に動的に生成する方法があります。動的に生成する方法の場合は,Webサービスの開始時にエラーが発生しないように,コンパイルしたWebサービス実装クラスに対してcjwsgenコマンドを実行することで,事前にエラーチェックができます。詳細については,「10.23(1) cjwsgenコマンドによるエラーチェックについて」を参照してください。
メソッドのパラメタとメッセージのパートのマッピング例を次の図に示します。
図16-4 メソッドのパラメタとメッセージのパートのマッピング例(wrapperスタイル)
![[図データ]](figure/zu120400.gif)
メソッドの戻り値とメッセージのパートのマッピング例を次の図に示します。
図16-5 メソッドの戻り値とメッセージのパートのマッピング例(wrapperスタイル)
![[図データ]](figure/zu120500.gif)
メソッドのパラメタおよび戻り値からメッセージのパートへのマッピング規則を次に示します。
- パラメタおよび戻り値は,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パラメタに指定できません。指定した場合,標準エラー出力とログにエラーメッセージが出力されます(KDJW61035-E)。
- Javaプリミティブ型は,javax.xml.ws.Holderクラスの型パラメタとしても指定できません。指定した場合,cjaptコマンドの実行時にエラーとなり終了します。
- Java型をoutおよびinoutパラメタに指定する場合,javax.xml.ws.Holderクラスの型パラメタとして指定できます。それ以外の方法で指定した場合は,標準エラー出力とログにエラーメッセージが出力されます(KDJW61035-E)。
(b) javax.xml.ws.Holder型
javax.xml.ws.Holder型を指定するときの注意事項について説明します。
- javax.xml.ws.Holderクラスの型パラメタに,javax.jws.WebParamアノテーションを指定する場合,mode要素でMode.OUTまたはMode.INOUTを指定する必要があります。mode要素を指定していない場合,またはmode要素にMode.INを指定した場合,標準エラー出力とログにエラーメッセージが出力されます(KDJW61031-E)。また,javax.jws.WebParamアノテーションを指定していない場合,javax.xml.ws.Holderの型パラメタは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個以上定義した場合は,cjaptコマンドの実行時にコンパイルエラーとなり終了します。
(3) Javaメソッドのパラメタの条件
Javaメソッドのパラメタ名は,WSDLにマッピングされないため,Java言語仕様で定めるJava識別子の命名規則に従って記述してください。
(4) パラメタと戻り値の組み合わせ
inパラメタ,inoutパラメタ,outパラメタ,および戻り値は,自由に組み合わせて記述できます。
(5) 名前衝突時の動作
wrapper beanクラス名とグローバル要素の名前についての規則,および名前衝突したときの動作について説明します。
- wrapper beanクラス名
生成されるwrapper beanクラス名は,パッケージ内でユニークな名前である必要があります。ただし,大文字/小文字の違いは無視されます。リクエストbeanまたはレスポンスbeanが,パッケージ内で同時に生成されるほかのJavaBeanクラスと名前衝突した場合,標準エラー出力とログにエラーメッセージが出力されます(KDJW61083-E)。
すでに存在するクラスと名前が重複していた場合は,上書きされます。ただし,そのクラスがcjaptコマンドの引数に含まれていた場合は,cjaptコマンド実行時にエラーチェックされます。
- グローバル要素(ローカル名および名前空間)
グローバル要素(ローカル名および名前空間)は,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アノテーションでアノテートします。
- cjaptコマンドを実行します。
アノテート済みのSEIをcjaptコマンドで解釈します。
value type,アダプタ,およびcjaptコマンドによってxmlJavaTypeAdapterアノテーションが適用されたリクエストbeanクラス/レスポンスbeanクラスの関係と実装例を次に示します。
図16-6 java.util.Mapの使用例
![[図データ]](figure/zu120600.gif)