WSDLからJava Remote Interface (RMI)へのコンパイラ

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コンパイラについてのガイドは次の節で構成されます。

  1. はじめに - WSDLの概要およびRMIとの関連についての説明です。
  2. データタイプ - wsdl2javaコンパイラがサポートするデータタイプです。
  3. 障害 - 障害メッセージのJava例外へのマップ方法です。
  4. 入出力および結果パラメータ - 入出力パラメータおよび出力パラメータのサポートです。
  5. カスタムタイプ - タイプマッパを使用するwsdl2javaコンパイラに新規タイプを追加する方法です。
コンパイラのコマンドラインオプションの詳細については、wsdl2javaのマンページを参照してください。

はじめに

WSDLドキュメントは次の主なセクションから構成されています。 WSDLのほとんどの概念は一般的なJavaの概念にマップします。
 
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に組み込みます。

Copyright © 2001-2003, Novell, Inc.All rights reserved.