35.3.1 WSDLファイルを作成する

WSDLファイルを作成し,Webサービスのメタ情報を定義します。WSDL定義は,次の仕様のサポート範囲内で定義してください。

WSDLファイルの作成方法には,新規に作成する方法と,Javaソースを変換したものを利用して作成する方法の2種類があります。

<この項の構成>
(1) 新規にWSDLファイルを作成する
(2) Javaソースを変換したものを基にWSDLファイルを作成する

(1) 新規にWSDLファイルを作成する

ここでは,WSDLファイル(input.wsdl)を作成します。作成したWSDLファイルは,UTF-8形式でc:¥temp¥jaxws¥works¥wsrm¥server¥WEB-INF¥wsdl¥ディレクトリに保存してください。

SOAP 1.1の場合の作成例を次に示します。

<?xml version="1.0" encoding="UTF-8"?>
<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/sample"
 targetNamespace="http://example.com/sample">
 
 <wsdl:types>
   <xsd:schema targetNamespace="http://example.com/sample">
     <!-- 要求メッセージの wrapper要素 -->
     <xsd:element name="jaxWsTest1" type="tns:jaxWsTest1"/>
     
     <!-- 応答メッセージの wrapper要素 -->
     <xsd:element name="jaxWsTest1Response" type="tns:jaxWsTest1Response"/>
     
     <!-- フォルトメッセージの wrapper要素 -->
     <xsd:element name="UserDefinedFault" type="tns:UserDefinedFault"/>
     
     <!-- 要求メッセージの wrapper要素が参照する型 -->
     <xsd:complexType name="jaxWsTest1">
       <xsd:sequence>
         <xsd:element name="information" type="xsd:string"/>
         <xsd:element name="count" type="xsd:int"/>
       </xsd:sequence>
     </xsd:complexType>
     
     <!-- 応答メッセージの wrapper要素が参照する型 -->
     <xsd:complexType name="jaxWsTest1Response">
       <xsd:sequence>
         <xsd:element name="return" type="xsd:string"/>
       </xsd:sequence>
     </xsd:complexType>
     
     <!-- フォルトメッセージの wrapper要素が参照する型 -->
     <xsd:complexType name="UserDefinedFault">
       <xsd:sequence>
         <xsd:element name="additionalInfo" type="xsd:int"/>
         <xsd:element name="detail" type="xsd:string"/>
         <xsd:element name="message" type="xsd:string"/>
       </xsd:sequence>
     </xsd:complexType>
   </xsd:schema>
 </wsdl:types>

 <!-- 要求メッセージ -->
 <wsdl:message name="jaxWsTest1Request">
   <wsdl:part name="inputParameters" element="tns:jaxWsTest1"/>
 </wsdl:message>

 <!-- 応答メッセージ -->
 <wsdl:message name="jaxWsTest1Response">
   <wsdl:part name="outputParameters" element="tns:jaxWsTest1Response"/>
 </wsdl:message>

 <!-- フォルトメッセージ -->
 <wsdl:message name="UserDefinedException">
   <wsdl:part name="fault" element="tns:UserDefinedFault"/>
 </wsdl:message>

 <!-- ポートタイプ -->
 <wsdl:portType name="TestJaxWs">
   <!-- オペレーション -->
   <wsdl:operation name="jaxWsTest1">
     <wsdl:input message="tns:jaxWsTest1Request"/>
     <wsdl:output message="tns:jaxWsTest1Response"/>
     <wsdl:fault name="UserDefinedFault"
       message="tns:UserDefinedException"/>
   </wsdl:operation>
 </wsdl:portType>

 <!-- バインディング(SOAP 1.1/HTTPバインディング) -->
 <wsdl:binding name="testJaxWsBinding" type="tns:TestJaxWs">
   <!-- document/literal/wrapped -->
   <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
   <!-- オペレーション -->
   <wsdl:operation name="jaxWsTest1">
     <soap:operation/>
     <wsdl:input>
       <soap:body use="literal"/>
     </wsdl:input>
     <wsdl:output>
       <soap:body use="literal"/>
     </wsdl:output>
     <wsdl:fault name="UserDefinedFault">
       <soap:fault name="UserDefinedFault" use="literal"/>
     </wsdl:fault>
   </wsdl:operation>
 </wsdl:binding>

 <!-- サービス -->
 <wsdl:service name="TestJaxWsService">
   <!-- ポート -->
   <wsdl:port name="testJaxWs" binding="tns:testJaxWsBinding">
     <soap:address location="http://webhost:8085/wsrm/TestJaxWsService"/>
   </wsdl:port>
 </wsdl:service>

</wsdl:definitions>

SOAP 1.2の場合の作成例を次に示します。

<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions name="TestJaxWsService"
 xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
 xmlns:tns="http://example.com/sample"
 targetNamespace="http://example.com/sample">
 
 <wsdl:types>
   <xsd:schema targetNamespace="http://example.com/sample">
     <!-- 要求メッセージの wrapper要素 -->
     <xsd:element name="jaxWsTest1" type="tns:jaxWsTest1"/>
     
     <!-- 応答メッセージの wrapper要素 -->
     <xsd:element name="jaxWsTest1Response" type="tns:jaxWsTest1Response"/>
     
     <!-- フォルトメッセージの wrapper要素 -->
     <xsd:element name="UserDefinedFault" type="tns:UserDefinedFault"/>
     
     <!-- 要求メッセージの wrapper要素が参照する型 -->
     <xsd:complexType name="jaxWsTest1">
       <xsd:sequence>
         <xsd:element name="information" type="xsd:string"/>
         <xsd:element name="count" type="xsd:int"/>
       </xsd:sequence>
     </xsd:complexType>
     
     <!-- 応答メッセージの wrapper要素が参照する型 -->
     <xsd:complexType name="jaxWsTest1Response">
       <xsd:sequence>
         <xsd:element name="return" type="xsd:string"/>
       </xsd:sequence>
     </xsd:complexType>
     
     <!-- フォルトメッセージの wrapper要素が参照する型 -->
     <xsd:complexType name="UserDefinedFault">
       <xsd:sequence>
         <xsd:element name="additionalInfo" type="xsd:int"/>
         <xsd:element name="detail" type="xsd:string"/>
         <xsd:element name="message" type="xsd:string"/>
       </xsd:sequence>
     </xsd:complexType>
   </xsd:schema>
 </wsdl:types>

 <!-- 要求メッセージ -->
 <wsdl:message name="jaxWsTest1Request">
   <wsdl:part name="inputParameters" element="tns:jaxWsTest1"/>
 </wsdl:message>

 <!-- 応答メッセージ -->
 <wsdl:message name="jaxWsTest1Response">
   <wsdl:part name="outputParameters" element="tns:jaxWsTest1Response"/>
 </wsdl:message>

 <!-- フォルトメッセージ -->
 <wsdl:message name="UserDefinedException">
   <wsdl:part name="fault" element="tns:UserDefinedFault"/>
 </wsdl:message>

 <!-- ポートタイプ -->
 <wsdl:portType name="TestJaxWs">
   <!-- オペレーション -->
   <wsdl:operation name="jaxWsTest1">
     <wsdl:input message="tns:jaxWsTest1Request"/>
     <wsdl:output message="tns:jaxWsTest1Response"/>
     <wsdl:fault name="UserDefinedFault"
       message="tns:UserDefinedException"/>
   </wsdl:operation>
 </wsdl:portType>

<!-- バインディング(SOAP 1.2/HTTPバインディング) -->
<wsdl:binding name="testJaxWsBinding" type="tns:TestJaxWs">
 <!-- document/literal/wrapped -->
 <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
   <!-- オペレーション -->
   <wsdl:operation name="jaxWsTest1">
     <soap12:operation/>
     <wsdl:input>
       <soap12:body use="literal"/>
     </wsdl:input>
     <wsdl:output>
       <soap12:body use="literal"/>
     </wsdl:output>
     <wsdl:fault name="UserDefinedFault">
       <soap12:fault name="UserDefinedFault" use="literal"/>
     </wsdl:fault>
   </wsdl:operation>
 </wsdl:binding>

 <!-- サービス -->
 <wsdl:service name="TestJaxWsService">
   <!-- ポート -->
   <wsdl:port name="testJaxWs" binding="tns:testJaxWsBinding">
     <soap12:address location="http://webhost:8085/wsrm/TestJaxWsService"/>
   </wsdl:port>
 </wsdl:service>

</wsdl:definitions>

(2) Javaソースを変換したものを基にWSDLファイルを作成する

ここでは,WSDL変換用に仮実装のWebサービス実装クラスと例外クラスを作成し,cjwsgenコマンドのWSDL生成機能を実行して,コンパイル済みのJavaソースからWSDLファイルを作成します。作成したクラスは,javax.jws.WebServiceアノテーションでアノテートします。SOAP 1.2を使用する場合,さらにSOAP 1.2を指定したjavax.xml.ws.BindingTypeアノテーションでアノテートしてください。メソッドを実装する必要はありません。

SOAP 1.1を使用する場合とSOAP 1.2を使用する場合では,仮実装のWebサービス実装クラスとTestJaxWsService.wsdlでソースコードが異なります。

SOAP 1.1の場合の仮実装のWebサービス実装クラスの例を次に示します。

package com.example.sample;

@javax.jws.WebService
public class TestJaxWsImpl {

   public String jaxWsTest1(String information, int count)
       throws UserDefinedException
   {
       // 実装不要
       return null;
   }

}

SOAP 1.2の場合の仮実装のWebサービス実装クラスの例を次に示します。

package com.example.sample;

@javax.jws.WebService
@javax.xml.ws.BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
public class TestJaxWsImpl {

   public String jaxWsTest1(String information, int count)
       throws UserDefinedException
   {
       // 実装不要
       return null;
   }

}

仮実装の例外クラスの例を次に示します。

package com.example.sample;

public class UserDefinedFault extends Exception{
   // 実装不要
   public int additionalInfo;
   public String detail;
   public String message;
}

作成したTestJaxWsImpl.javaとUserDefinedFault.javaをUTF-8形式でc:¥temp¥jaxws¥works¥wsrm¥server¥temporary¥src¥com¥example¥sample¥ディレクトリに保存し,コンパイルします。コンパイルの例を次に示します。

> cd c:¥temp¥jaxws¥works¥wsrm¥server¥
> mkdir .¥temporary
> mkdir .¥temporary¥classes
> javac -encoding UTF-8 -cp "%COSMINEXUS_HOME%¥jaxws¥lib¥cjjaxws.jar;%COSMINEXUS_HOME%¥CC¥client¥lib¥j2ee-javax.jar" -d .¥temporary¥classes .¥temporary¥src¥com¥example¥sample¥TestJaxWsImpl.java .¥temporary¥src¥com¥example¥sample¥UserDefinedFault.java

コンパイルが正常に終了すると,c:¥temp¥jaxws¥works¥wsrm¥server¥temporary¥classes¥com¥example¥sample¥ディレクトリにTestJaxWsImpl.classとUserDefinedFault.classが生成されます。これらのクラスファイルを利用して,cjwsgenコマンドのWSDL生成機能でWSDLファイルを作成します。

cjwsgenコマンドの実行例を次に示します。

> cd c:¥temp¥jaxws¥works¥wsrm¥server¥
> mkdir .¥WEB-INF¥wsdl¥
> "%COSMINEXUS_HOME%¥jaxws¥bin¥cjwsgen.bat" -r .¥WEB-INF¥wsdl -d .¥temporary¥classes -cp .¥temporary¥classes com.example.sample.TestJaxWsImpl

cjwsgenコマンドが正常に終了すると,c:¥temp¥jaxws¥works¥wsrm¥WEB-INF¥wsdl¥ディレクトリにTestJaxWsService.wsdlとTestJaxWsService_schema1.xsdが生成されます。c:¥temp¥jaxws¥works¥wsrm¥temporary¥classes¥ディレクトリにあるクラスは削除してください。

生成されたTestJaxWsService.wsdlとTestJaxWsService_schema1.xsdは,一部修正する必要があります。

SOAP 1.1の場合のTestJaxWsService.wsdlの修正例を次に示します。イタリック体になっている個所が,修正した個所です。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions targetNamespace="http://example.com/sample" name="TestJaxWsImplService" xmlns:tns="http://example.com/sample" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns="http://schemas.xmlsoap.org/wsdl/">
 <types>
   <xsd:schema targetNamespace="http://example.com/sample">
     <xsd:include schemaLocation="TestJaxWsImplService_schema1.xsd"/>
   </xsd:schema>
 </types>
 <message name="jaxWsTest1">
   <part name="parameters" element="tns:jaxWsTest1"/>
 </message>
 <message name="jaxWsTest1Response">
   <part name="parameters" element="tns:jaxWsTest1Response"/>
 </message>
 <message name="UserDefinedFault">
   <part name="fault" element="tns:UserDefinedFault"/>
 </message>
 <portType name="TestJaxWs">
   <operation name="jaxWsTest1">
     <input message="tns:jaxWsTest1"/>
     <output message="tns:jaxWsTest1Response"/>
     <fault message="tns:UserDefinedFault" name="UserDefinedFault"/>
   </operation>
 </portType>
 <binding name="testJaxWsBinding" type="tns:TestJaxWs">
   <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
   <operation name="jaxWsTest1">
     <soap:operation soapAction=""/>
     <input>
       <soap:body use="literal"/>
     </input>
     <output>
       <soap:body use="literal"/>
     </output>
     <fault name="UserDefinedFault">
       <soap:fault name="UserDefinedFault" use="literal"/>
     </fault>
   </operation>
 </binding>
 <service name="TestJaxWsService">
   <port name="testJaxWs" binding="tns:testJaxWsBinding">
     <soap:address location="http://webhost:8085/wsrm/TestJaxWsService"/>
   </port>
 </service>
</definitions>

SOAP 1.2の場合のTestJaxWsService.wsdlの修正例を次に示します。イタリック体になっている個所が,修正した個所です。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions targetNamespace="http://example.com/sample" name="TestJaxWsImplService" xmlns:tns="http://example.com/sample" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns="http://schemas.xmlsoap.org/wsdl/">
 <types>
   <xsd:schema targetNamespace="http://example.com/sample">
     <xsd:include schemaLocation="TestJaxWsImplService_schema1.xsd"/>
   </xsd:schema>
 </types>
 <message name="jaxWsTest1">
   <part name="parameters" element="tns:jaxWsTest1"/>
 </message>
 <message name="jaxWsTest1Response">
   <part name="parameters" element="tns:jaxWsTest1Response"/>
 </message>
 <message name="UserDefinedFault">
   <part name="fault" element="tns:UserDefinedFault"/>
 </message>
 <portType name="TestJaxWs">
   <operation name="jaxWsTest1">
     <input message="tns:jaxWsTest1"/>
     <output message="tns:jaxWsTest1Response"/>
     <fault message="tns:UserDefinedFault" name="UserDefinedFault"/>
   </operation>
 </portType>
 <binding name="testJaxWsBinding" type="tns:TestJaxWs">
   <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
   <operation name="jaxWsTest1">
     <soap12:operation soapAction=""/>
     <input>
       <soap12:body use="literal"/>
     </input>
     <output>
       <soap12:body use="literal"/>
     </output>
     <fault name="UserDefinedFault">
       <soap12:fault name="UserDefinedFault" use="literal"/>
     </fault>
   </operation>
 </binding>
 <service name="TestJaxWsService">
   <port name="testJaxWs" binding="tns:testJaxWsBinding">
     <soap12:address location="http://webhost:8085/wsrm/TestJaxWsService"/>
   </port>
 </service>
</definitions>

TestJaxWsService_schema1.xsdの修正例を次に示します。イタリック体になっている個所が,修正した個所です。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" targetNamespace="http://example.com/sample" xmlns:tns="http://example.com/sample" xmlns:xs="http://www.w3.org/2001/XMLSchema">

 <xs:element name="UserDefinedFault" type="tns:UserDefinedFault"/>

 <xs:element name="jaxWsTest1" type="tns:jaxWsTest1"/>

 <xs:element name="jaxWsTest1Response" type="tns:jaxWsTest1Response"/>

 <xs:complexType name="jaxWsTest1">
   <xs:sequence>
     <xs:element name="arg0" type="xs:string" minOccurs="0"/>
     <xs:element name="arg1" type="xs:int"/>
   </xs:sequence>
 </xs:complexType>

 <xs:complexType name="jaxWsTest1Response">
   <xs:sequence>
     <xs:element name="return" type="xs:string" minOccurs="0"/>
   </xs:sequence>
 </xs:complexType>

 <xs:complexType name="UserDefinedFault">
   <xs:sequence>
     <xs:element name="message" type="xs:string" minOccurs="0"/>
   </xs:sequence>
 </xs:complexType>
</xs:schema>

修正したTestJaxWsService.wsdlは,名前をinput.wsdlに変更して,c:¥temp¥jaxws¥works¥wsrm¥server¥WEB-INF¥wsdl¥ディレクトリに保存してください。