Novell exteNd WebサービスSDKwsdl2javaコンパイラはWSDLドキュメントをJava RMIインタフェースに変換します。 このコンパイラはWebサービスを呼び出して実装するため、Javaプログラマに通常の入力されたプログラミングモデルを提供します。 クライアントは、通常のJavaオブジェクトが同じアドレススペースにあるかのようにスタブを使用してWebサービスを呼び出し、サーバがservlet baseクラスを実装します。wsdl2javaコンパイラは通常、既存のWebサービスへのアクセスに必要なJavaクライアントプログラムを開発する際使用されます。 WSDLが予想より広範囲にわたって使用されると、標準のインターネットサービスがWSDLドキュメントによって形式化されると推測されます。 wsdl2javaコンパイラは、開発者がWSDLを使用して定義されているサービスをJavaベースで実装する場合に使用されます。
Novell exteNd WebサービスSDK wsdl2javaコンパイラについてのガイドは次の節で構成されます。
コンパイラのコマンドラインオプションの詳細については、wsdl2javaのマンページを参照してください。
- はじめに - WSDLの概要およびRMIとの関連についての説明です。
- データタイプ - wsdl2javaコンパイラがサポートするデータタイプです。
- 障害 - 障害メッセージのJava例外へのマップ方法です。
- 入出力および結果パラメータ - 入出力パラメータおよび出力パラメータのサポートです。
- カスタムタイプ - タイプマッパを使用するwsdl2javaコンパイラに新規タイプを追加する方法です。
はじめに
WSDLドキュメントは次の主なセクションから構成されています。WSDLのほとんどの概念は一般的なJavaの概念にマップします。
- タイプ: この節ではWebサービスで利用できるデータタイプを定義します。 通常XSDを使用するタイプが定義されます。
- メッセージ: Webサービスとのデータの交換に使用されるメッセージです。 データにはパラメータ、戻り値および障害が含まれます。
- 操作: Webサービス上で実行できるアクションです。
- ポートタイプ: 操作のコレクションです。
- バインド: ポートタイプの具体的なプロトコルおよびデータ形式を規定します。
- ポート: バインドおよびネットワークアドレスです。 ポートはWebサービス上のアクセスおよび呼び出しに必要な情報を定義するため、エンドポイントとも呼ばれます。
- サービス: 最後に複数の関連エンドポイントを結合します。
WSDL Java タイプ タイプ メッセージ パラメータ、戻り値および例外 操作 メソッド ポートタイプ インタフェース バインド Web Serviceオブジェクトインスタンスが使用する転送およびプロトコルです。 サービス Web Serviceオブジェクトインスタンスで利用できるアドレスのセットです。 表1: WSDLおよびJavaの相当する概念
バインドおよびサービス情報のない簡単なWSDLドキュメントを次に示します。 2国間の為替レートを戻す単純な通貨サービスを定義します。
<?xml version="1.0"?>
<definitions name="CurrencyService"
targetNamespace="http://example.com/currency.wsdl"
xmlns:tns="http://example.com/currency.wsdl"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<message name="GetRateInput">
<part name="country1" element="xsd:string"/>
<part name="country2" element="xsd:string"/>
</message>
<message name="GetRateOutput">
<part name="result" type="xsd:float"/>
</message>
<portType name="Currency">
<operation name="getRate">
<input message="tns:GetRateInput"/>
<output message="tns:GetRateOutput"/>
</operation>
</portType>
</definitions>例1: 簡単な為替サービス用WSDL
通貨WSDLは次の通り単一メソッドでJavaRMIにマップします。
import java.rmi.Remote;
import java.rmi.RemoteException;public interface Currency extends Remote
{
float getRate(String country1, String country2) throws RemoteException;
}例2: 簡単な為替サービス用Javaインタフェース
データタイプ
次の表はwsdl2javaコンパイラがサポートするXMLデータタイプおよびそのデータタイプがマップされるJavaタイプを示しています。 これらのタイプはhttp://www.w3.org/2001/XMLSchemaネームスペースで定義されています。 XMLデータタイプの詳細は、W3CのWebサイトで仕様を参照してください。
XMLデータタイプ Javaデータタイプ anyType java.lang.Object boolean boolean byte byte base64Binary byte[] hexBinary byte[] dateTime java.util.Calendar integer java.math.BigInteger double double float float int int long long decimal java.math.BigDecimal short short string java.lang.String QName javax.xml.rpc.namespace.QName 表2: XMLおよびJavaデータタイプ間のマッピング
残りのXMLスキーマの単純なデータタイプは次の表3の概要どおりNovell exteNd WebサービスSDKクラスにマップされます。
XMLデータタイプ Javaデータタイプ anyType java.lang.Object anyURI com.sssw.jbroker.web.xsd.AnyURI date com.sssw.jbroker.web.xsd.Date duration com.sssw.jbroker.web.xsd.Duration ENTITIES com.sssw.jbroker.web.xsd.ENTITIES ENTITY com.sssw.jbroker.web.xsd.ENTITY gDay com.sssw.jbroker.web.xsd.GDay gMonth com.sssw.jbroker.web.xsd.GMonth gMonthDay com.sssw.jbroker.web.xsd.GMonthDay gYearDay com.sssw.jbroker.web.xsd.GYearDay ID com.sssw.jbroker.web.xsd.ID IDREF com.sssw.jbroker.web.xsd.IDREF IDREFS com.sssw.jbroker.web.xsd.IDREFS language com.sssw.jbroker.web.xsd.Language Name com.sssw.jbroker.web.xsd.Name NCName com.sssw.jbroker.web.xsd.NCName NegativeInteger com.sssw.jbroker.web.xsd.NegativeInteger NMTOKEN com.sssw.jbroker.web.xsd.NMTOKEN NMTOKENS com.sssw.jbroker.web.xsd.NMTOKENS NonNegativeInteger com.sssw.jbroker.web.xsd.NonNegativeInteger NonPositiveInteger com.sssw.jbroker.web.xsd.NonPositiveInteger NormalizedString com.sssw.jbroker.web.xsd.NormalizedString PositiveInteger com.sssw.jbroker.web.xsd.PositiveInteger Time com.sssw.jbroker.web.xsd.Time Token com.sssw.jbroker.web.xsd.Token UnsignedByte com.sssw.jbroker.web.xsd.UnsignedByte UnsignedInt com.sssw.jbroker.web.xsd.UnsignedInt UnsignedLong com.sssw.jbroker.web.xsd.UnsignedLong UnsignedLong com.sssw.jbroker.web.xsd.UnsignedLong 表3: XMLの単純なタイプおよびJavaデータタイプ間のマッピング
単純なXMLタイプを宣言する際場合にnillable属性が「true」に設定されると、wsdl2javaコンパイラは次の表4の概要どおりJavaボックスタイプを生成します。
XMLNillableデータタイプ Javaデータタイプ boolean java.lang.Boolean byte java.lang.Byte double java.lang.Double float java.lang.Float int java.lang.Integer long java.lang.Long short java.lang.Short 表4: XMLnillableタイプおよびJavaデータタイプ間のマッピング
SOAP1.1.仕様で規定されたデータタイプは常にnillableです。次の表の仕様どおりマップされます。
SOAPエンコードタイプ Javaデータタイプ boolean java.lang.Boolean byte java.lang.Byte double java.lang.Double float java.lang.Float int java.lang.Integer long java.lang.Long short java.lang.Short decimal java.util.BigDecimal base64 byte[] 表5: XML nillableタイプおよびJavaデータタイプ間のマッピング
さらにNovell exteNd WSSDKコンパイラはhttp://schemas.silverstream.com/jBrokerネームスペースで定義されている複数のほかのXMLタイプをサポートします。 これらのタイプは次の表6の通りです。 相互運用性はNovell exteNd WSSDKデータタイプを使用する際 生成されず、クライアントおよびサーバがNovell exteNd WSSDKを使用して開発された場合のみ安全に使用できます。
Novell exteNd WSSDK XMLデータタイプ Javaデータタイプ Class java.lang.Class List java.util.List Long java.lang.Long Map java.util.Map Service java.rmi.Remote Set java.util.Set 表6: Novell exteNd WSSDK XMLタイプおよびJavaデータタイプ間のマッピング
wsdl2javaコンパイラはWSDL仕様で規定されたSOAP配列構文をサポートします。 組込みまたはカスタムタイプは配列の作成に使用されます。 配列の例は、次のとおりです。
<complexType name="ArrayOfString">
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType" wsdl:arrayType="xsd:string[]"/>
</restriction>
</complexContent>
</complexType>例3: WSDLの配列タイプの定義
Novell exteNd WSSDKでは上で説明した配列定義が基本ですが、その他にも複数の定義がサポートされておりWSDLドキュメントの解析に柔軟に対応できます。 次に示す4つの配列定義はwsdl2javaコンパイラによって認識されます。
<complexType name='ArrayOfString'>
<sequence>
<element name='name' type='xsd:string' maxOccurs='unbounded'/>
</sequence>
</complexType>例3a: WSDLの配列タイプの代替定義
<complexType name='ArrayOfString'>
<complexContent>
<restriction base='SOAP-ENC:Array'>
<sequence>
<element name='name' type='xsd:String' maxOccurs='unbounded'/>
</sequence>
</restriction>
</complexContent>
</complexType>例3b: WSDLの配列タイプの代替定義2
<element name='ArrayOfString'>
<complexType>
<element name='name' type='xsd:String' maxOccurs='unbounded'/>
</complexType>
</element>例3c: WSDLの配列タイプの代替定義3
<element name='ArrayOfString'>
<complexType>
<sequence>
<element name='name' type='xsd:String' maxOccurs='unbounded'/>
</sequence>
</complexType>
</element>例3d: WSDLの配列タイプの代替定義4
障害
WSDLによって障害メッセージを生成できます。 障害メッセージは例外Java Beanのプロパティへ障害メッセージ部分を変換することによってJava例外にマップします。 マーシャラが生成され、例外Java Beanをシリアル化および非シリアル化します。
<?xml version="1.0"?>
<definitions name="NameService"
targetNamespace="http://example.com/name.wsdl"
xmlns:tns="http://example.com/name.wsdl"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<message name="GetNameInput">
<part name="id" element="xsd:int"/>
</message>
<message name="GetNameOutput">
<part name="result" type="xsd:string"/>
</message>
<message name="NameNotFound">
<part name="id" type="xsd:int"/>
</message>
<portType name="NameService">
<operation name="getRate">
<input message="tns:GetNameInput"/>
<output message="tns:GetNameOutput"/>
<fault name="NoName" message="tns:NameNotFound"/>
</operation>
</portType>
</definitions>例4: 障害メッセージがあるネームサービス用WSDL
WSDLドキュメントは次のRMIにマップされます。
import java.rmi.Remote;
import java.rmi.RemoteException;public interface NameService extends Remote
{
String getName(int id) throws NameNotFound, RemoteException;
}例5: ネームサービス用Javaインタフェース
NameNotFound例外はメッセージの各パートのビーンプロパティが1つあるJava Beanです。 exceptionクラスの生成に加えて、wsdl2javaコンパイラはNameNotFoundMarshaler javaクラスを生成し、このタイプの例外のシリアル化および非シリアル化をサポートします。
public class NameNotFound extends Exception
{
private int _id;public NameNotFound() {
}public NameNotFound(int id) {
_id = id;
}public int getId() {
return _id;
}public setId(int _id) {
_id = id;
}
}例6: 障害メッセージのために生成されたJava例外
Inout Parameters and Return Values
WSDLは入出力パラメータおよび戻り値のあるパラメータをサポートします。 単一部分のある出力メッセージは、その出力メッセージが入力パラメータであるまたはparameterOrder属性で規定される場合を除いて通常の戻り値にマップされます。 複数部分のある出力メッセージは出力パラメータにマップされます。 パーツに「result」または「return」がある部分、wsdl2javaコンパイラは、入力メッセージが「result」または「return」部分に対応している場合を除いてそのパーツを戻り値にマップします。
<?xml version="1.0"?>
<definitions name="InOutService"
targetNamespace="http://example.com/inout.wsdl"
xmlns:tns="http://example.com/inout.wsdl"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.xmlsoap.org/wsdl/">
<message name="Input">
<part name="A" element="xsd:int"/>
<part name="B" element="xsd:long"/>
</message>
<message name="Output">
<part name="A" type="xsd:int"/>
</message>
<portType name="Service">
<operation name="foo" parameterOrder="B A">
<input message="tns:Input"/>
<output message="tns:Output"/>
</operation>
</portType>
</definitions>例7: パラメータ命令および入出力パラメータ、戻りパラメータのあるWSDL
入出力メッセージ「A」があるため、入出力パラメータにマップします。 Javaは値セマンティクス渡しを使用するため、このコンセプトはJavaオブジェクトまたはプリミティブタイプをラップする特定holderクラスの使用によってサポートされます。 ホルダタイプはすべてNovell exteNd WSSDKでサポートされ、wsdl2javaコンパイラはほかの出力タイプまたは入出力タイプのホルダを自動的に生成します。 この例ではparameterOrder属性の使用方法も説明します。
import java.rmi.Remote;
import java.rmi.RemoteException;public interface Service extends Remote
{
void foo(long B, IntHolder A) throws RemoteException;
}例8: HolderパラメータのあるJavaインタフェース
カスタムタイプ
wsdl2javaコンパイラは、Novell exteNd WSSDKのタイプマッパコンポーネントと完全に統合されています。 wsdl2javaコンパイラでカスタムタイプを利用可能にするには、xmlrpc.type.mappingsと呼ばれるリソースを提供する必要があります。このリソースはコンパイラがリソースを選ぶためにCLASSPATHで利用する必要があります。 このリソースの形式は、アドレスブックの例の説明と同じです:
# # Address Book Type Library Descriptor # address=addressbook.Address addressbook.AddressMarshaler addressbook.AddressMarshaler urn:AddressBook Address http://www.acme.com/schemas exception=addressbook.NoAddressFound com.sssw.jbroker.web.mapping.BeanMarshaler com.sssw.jbroker.web.mapping.BeanMarshaler urn:AddressBook NoAddressFound http://www.acme.com/schemas-verboseフラグのあるwsdl2java コンパイラを実行する場合、ロードするマッピングタイプをすべて出力します。 コンパイラによるxmlrpc.type.mappingsファイルの選択を確認するには、jbroker-web.jarがあるlibディレクトリにそのファイルを配置します。 コンパイラは通常実行前にlibディレクトリをCLASSPATHに組み込みます。