3.4.1 document/literal使用時のWSDLの生成
document/literalに対応したWSDLの生成方法,およびJavaインタフェースとWSDLのマッピングについて説明します。
(1) WSDLの生成
document/literalに対応したWSDLは,Java2WSDLコマンドで生成できます。Java2WSDLコマンドの-zオプションで「DOCUMENT」,-uオプションで「LITERAL」を指定します。
Java2WSDLコマンドの使用方法については,「9.1 Java2WSDLコマンド(WSDLの生成)」を参照してください。
- 注意事項
-
DOCUMENTスタイルを使用する場合,メソッドをオーバーロードしているJavaインタフェースを指定することはできません。
DOCUMENTスタイルでは,Javaインタフェースのメソッド名を要素名とする要素がWSDLに定義され,その要素によって引数および戻り値がラップされます。したがって,Javaインタフェースでメソッドをオーバーロードしている場合,同一名称のメソッドが複数存在することになり,WSDLにも同一要素名の要素が多重定義されてしまいます。
Java2WSDLコマンドで指定できないJavaインタフェースを指定した場合は,エラーメッセージが出力され,異常終了となります。
(2) Java2WSDLコマンドで生成されるWSDL
document/literal使用時のJavaインタフェースとWSDLのマッピング,および生成されるWSDLの詳細仕様について説明します。
(a) JavaインタフェースとWSDLのマッピング
次に示すWSDLの生成例を基に,document/literal使用時のJavaインタフェースとWSDLのマッピングについて説明します。
- JavaインタフェースとWSDLのマッピング
-
-
wsdl:types要素内のxsd:element要素に,対象メソッドの「メソッド名」が要素名として定義されます。また,「メソッド名」要素の子要素に,対象メソッドの引数が定義されます(図中の(1)および(2))。
-
wsdl:types要素内のxsd:element要素に,対象メソッドの「メソッド名」+「Response」が要素名として定義されます。また,「メソッド名」+「Response」要素によって,対象メソッドの戻り値および引数で与えられたHolderクラスがラップされます。なお,対象メソッドの戻り値は,「メソッド名」+「Return」要素の子要素として定義されます(図中の(3)および(4))。
-
対象メソッドの引数および戻り値をラップした要素が,wsdl:message要素の子要素であるwsdl:part要素のelement属性で参照されます(図中の(5)および(6))。
-
Java2WSDLコマンドでdocument/literalに対応したWSDLを生成する場合,常にwrapped形式のWSDLが生成されます。
なお,次のどちらかが該当する場合,子要素に空のcomplexType要素(<complexType/>)を持つ「メソッド名」要素および「メソッド名」+「Response」要素が生成されます。
-
対象メソッドの引数がない場合
-
戻り値がvoidで,引数にHolderクラスが含まれない場合
(b) 生成されるWSDLの定義内容
次の表に,Java2WSDLコマンドでdocument/literalに対応したWSDLを生成した場合の定義内容を示します。
WSDL中の要素 |
定義内容 |
||
---|---|---|---|
wsdl:types要素 |
xsd:schema要素 |
xsd:schema要素 |
elementFormDefault属性の値は"qualified"が定義されます。 |
リクエストメッセージに対応するxsd:element要素 |
|
||
レスポンスメッセージに対応するxsd:element要素 |
メソッドの戻り値がvoid,かつメソッドの引数にHolderクラスが含まれない場合は子要素として空のxsd:complexType要素が定義されます。 |
||
リクエストメッセージに対応するwsdl:message要素※3 |
wsdl:part要素 |
element属性でxsd:schema要素下で定義されている,name属性が"メソッド名"の要素が定義されます。 |
|
レスポンスメッセージに対応するwsdl:message要素※3 |
wsdl:part要素 |
element属性でxsd:schema要素下で定義されているname属性が"メソッド名"+"Response"の要素が定義されます。 |
|
wsdl:binding要素 |
soap:binding要素 |
style属性で"document"が定義されます。 |
|
wsdl:input要素/wsdl:output要素 |
soap:body要素 |
|
(3) JavaソースコードとWSDLのマッピング例
Javaインタフェース,Javaクラス,およびdocument/literalに対応したWSDLの生成例を示します。
-
Java2WSDLコマンドに指定するJavaインタフェース
package localhost; public interface UserInfo { public UserData getUserData(String in0, int in1); }
-
Java2WSDLコマンドに指定するJavaインタフェースから利用されるクラスの定義
package localhost; public class UserData { private String name; private String section; private String telephone; public UserData() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSection() { return section; } public void setSection(String section) { this.section = section; } public String getTelephone() { return telephone; } public void setTelephone(String telephone) { this.telephone = telephone; }
-
生成されたdocument/literalのWSDL
<wsdl:definitions targetNamespace="http://localhost" xmlns:intf="http://localhost" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <wsdl:types> <schema elementFormDefault="qualified" targetNamespace="http://localhost" xmlns="http://www.w3.org/2001/XMLSchema"> <element name="getUserData"> <complexType> <sequence> <element name="in0" type="xsd:string"/> <element name="in1" type="xsd:int"/> </sequence> </complexType> </element> <element name="getUserDataResponse"> <complexType> <sequence> <element name="getUserDataReturn" type="intf:UserData"/> </sequence> </complexType> </element> <complexType name="UserData"> <sequence> <element name="name" nillable="true" type="xsd:string"/> <element name="section" nillable="true" type="xsd:string"/> <element name="telephone" nillable="true" type="xsd:string"/> </sequence> </complexType> </schema> </wsdl:types> <wsdl:message name="getUserDataRequest"> <wsdl:part element="intf:getUserData" name="parameters"/> </wsdl:message> <wsdl:message name="getUserDataResponse"> <wsdl:part element="intf:getUserDataResponse" name="parameters"/> </wsdl:message> <wsdl:portType name="UserInfo"> <wsdl:operation name="getUserData"> <wsdl:input message="intf:getUserDataRequest" name="getUserDataRequest"/> <wsdl:output message="intf:getUserDataResponse" name="getUserDataResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="UserInfoSoapBinding" type="intf:UserInfo"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="getUserData"> <soap:operation soapAction=""/> <wsdl:input name="getUserDataRequest"> <soap:body use="literal"/> </wsdl:input> <wsdl:output name="getUserDataResponse"> <soap:body use="literal"/> </wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="UserInfoService"> <wsdl:port binding="intf:UserInfoSoapBinding" name="UserInfo"> <soap:address location="http://localhost/RPCSampleService/services/UserInfo"/> </wsdl:port> </wsdl:service> </wsdl:definitions>