15.1.4 メッセージのパートからパラメタおよび戻り値へのマッピング(wrapperスタイルの場合)
WSDLのメッセージのパート(wsdl:message要素のwsdl:part子要素)からJavaのメソッドのパラメタおよび戻り値へのマッピングについて説明します。
ここでは,wrapperスタイルの場合について説明します。
-
wrapperスタイルは次に示す条件をすべて満たす場合に,wrapperスタイルとして扱われます。条件を満たさない場合は,non-wrapperスタイルとして扱われます。
-
WSDLのオペレーションのsoap:body要素から参照するinputメッセージは,パートを1個だけ含んでいる。
パートを2個以上含んでいる場合は,標準エラー出力とログにエラーメッセージが出力され,処理が終了されます(KDJW51019-E)。
-
WSDLのオペレーションから参照するoutputメッセージ(存在する場合)は,パートを1個だけ含んでいる。
パートを2個以上含んでいる場合は,標準エラー出力とログにエラーメッセージが出力され,処理が終了されます(KDJW51020-E)。
-
inputメッセージのパートは,ローカル名がオペレーション名と等しいグローバル要素を参照している。
-
outputメッセージ(存在する場合)のパートは,グローバル要素を参照している。
-
inputメッセージとoutputメッセージ(存在する場合)のパートから参照されている要素の型は,xsd:sequenceで定義したxsd:complexTypeである。
-
wrapper要素は子要素を含むだけであり,xsd:any要素,xsd:anyAttribute属性,xsd:choise要素,substitutionGroup属性,またはattribute要素のようなほかの構成要素を含まない。
-
wrapper要素はnillableでない。
-
- 〈この項の構成〉
(1) マッピング
-
request-responseオペレーションのWSDLからのマッピングの場合
request-responseオペレーションのWSDL(wsdl:input要素,およびwsdl:output要素を1個と,wsdl:fault要素を0個以上定義する)のメッセージのパートから参照するwrapper子要素と,Javaメソッドのパラメタおよび戻り値がマッピングされます。マッピング例を次の図に示します。
図15‒4 メッセージのパートとパラメタおよび戻り値のマッピング例(request-responseオペレーション) -
one-wayオペレーションのWSDLからのマッピングの場合
one-wayオペレーションのWSDL(wsdl:input要素を1個だけ定義)のメッセージのパートから参照するwrapper子要素と,Javaメソッドのパラメタがマッピングされます。マッピング例を次の図に示します。
図15‒5 メッセージのパートとパラメタのマッピング例(one-wayオペレーション)
マッピングするときに,request-responseオペレーションまたはone-wayオペレーションのどちらの場合でも,WSDLのwrapper子要素名の先頭文字は小文字に変換されます。
(変換前)WrapperName (変換後)wrapperName
-
パートの種類とJavaソースへのマッピングの関係
パートの種類(in,inout,out)と,Javaソースへのマッピングの関係を次の表に示します。
(2) wrapper子要素名の条件
wrapper子要素名には,次の表に示すすべての条件を満たす文字列を記述できます。ただし,バインディング宣言でカスタマイズする場合は,XML Schema仕様のxsd:NCName型として使用できる文字列を記述できます。
(3) 複数のwrapper子要素が同一のwrapper子要素となる条件
inputメッセージまたはoutputメッセージに出現するwrapper子要素をWSDL内に複数記述した場合,wrapper子要素のローカル名とXML Schemaの型が同じか異なるかによって,wrapper子要素の扱いは次の表のとおり異なります。
項番 |
wrapper子要素のローカル名 |
wrapper子要素のXML Schema型 |
wrapper子要素の扱い |
---|---|---|---|
1 |
ローカル名が同じ場合 |
XML Schema型が同じ場合 |
同じwrapper子要素として扱われます。それぞれのwrapper子要素が,xsd:element要素のref属性で間接的に同じグローバル要素を参照している場合も,同じwrapper子要素として扱われます。 |
2 |
XML Schema型が異なる場合 |
別のwrapper子要素として扱われます。 |
|
3 |
ローカル名が異なる場合 |
XML Schema型が同じ場合 |
別のwrapper子要素として扱われます。 |
4 |
XML Schema型が異なる場合 |
(4) 複数のwrapper 子要素を記述した場合の注意事項
複数の同じwrapper子要素と,異なるwrapper子要素を複合型の子要素として同時にWSDLファイルに定義している場合,そのWSDLファイルを指定してcjwsimportコマンドに実行したときに,SEIがnon-wrapperスタイルでマッピングされます。
SEIがnon-wrapperスタイルでマッピングされるWSDLファイルの例を次に示します。
<wsdl:definitions name="TestJaxWsService" xmlns:soap=http://schemas.xmlsoap.org/wsdl/soap/ xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://example.com/example" targetNamespace="http://example.com/example"> <xsd:element name="getUserData" type="tns:getUserData"/> ... <xsd:complexType name="getUserData"> <xsd:sequence> <xsd:element name="in0" type="xsd:string"/> <xsd:element name="in0" type="xsd:string"/> <xsd:element name="hoge" type="xsd:string"/> </xsd:sequence> </xsd:complexType> ... </xsd:schema> </wsdl:types> ... <wsdl:message name="getUserDataRequest"> <wsdl:part name="inputParameters" element="tns:getUserData"/> </wsdl:message> ... </wsdl:definitions>
(5) パラメタへのマッピングの注意事項
-
wrapper子要素をJavaへマッピングするときに,メソッドのパラメタの型は異なっていてもパラメタ名が同じになると,標準エラー出力とログにエラーメッセージが出力され,処理が終了されます。
-
inおよびinoutのwrapper子要素からマッピングされたパラメタは,wrapper要素内の対応するwrapper子要素の出現順序でマッピングされます。outのwrapper子要素からマッピングされたパラメタは,wrapper要素内の対応するwrapper子要素の出現順序でマッピングされます。
-
in,inout,outのwrapper子要素が混在している場合,inとinoutのwrapper子要素が,wrapper要素内の対応するwrapper子要素の出現順序でマッピングされます。そのあとにoutのwrapper子要素が,wrapper要素内の対応するwrapper子要素の出現順序でマッピングされます。
-
Javaプリミティブ型,Java配列型,ユーザ定義型であるout(戻り値にマッピングされるものは除く),およびinoutのパラメタは,JavaソースではHolder型(javax.xml.ws.Holder<T>)にマッピングされます。その例を次に示します。
- (例)
-
outおよびinoutのパートのデータ型:java.lang.String
Javaへのマッピング後のデータ型:javax.xml.ws.Holder<java.lang.String>
-
Javaへマッピング後のパラメタの数は,0〜254個で指定してください。255個以上指定した場合は,標準エラー出力とログにエラーメッセージが出力され,処理が終了されます(KDJW51016-E)。
(6) 戻り値へのマッピングの注意事項
outのwrapper子要素が1個の場合,またはoutのwrapper子要素のローカル名が"return"の場合,その値がメソッドの戻り値へマッピングされます。ただし,型は異なっていてもローカル名が"return"であるwrapper子要素を複数記述した場合,標準エラー出力とログにエラーメッセージが出力され,処理が終了されます。