Hitachi

Cosminexus V11 アプリケーションサーバ SOAPアプリケーション開発の手引


3.8.2 DIIのクライアント側の処理を実装する

DIIを使用する場合,クライアント側にServiceオブジェクト,Callオブジェクト,およびパラメタを生成する処理を実装します。また,SOAPサービスを呼び出す処理を実装します。クライアント側の処理の実装例については,「4.5 DIIを使用して開発する場合」を参照してください。

〈この項の構成〉

(1) Serviceオブジェクトの生成

Serviceオブジェクトは次の手順で生成します。

  1. ServiceFactory#newInstanceメソッドを使用して,ServiceFactoryオブジェクトを生成します。

  2. WSDLのURLを表すURLオブジェクトを生成します。引数にWSDLのURL文字列を指定します。

  3. サービスのQNameオブジェクトを生成します。wsdl:service要素の名前空間URIを名前空間URIとして,wsdl:service要素のname属性をローカル名として,引数に指定します。

  4. ServiceFactory#createService(URL wsdlDocumentation, QName serviceName)メソッドを使用して,Serviceインスタンスを生成します。引数に2.および3.で生成したオブジェクトを指定します。

    URLには,ローカルファイルへのパスを設定する必要があります。Windows環境では大文字と小文字は区別されません。UNIX環境では大文字と小文字が区別されます。ローカルファイル以外のパスを設定した場合は,javax.xml.rpc.ServiceException例外がスローされます。

    SOAPクライアントライブラリは,Serviceインスタンス生成時に,WSDLを読み込み,ServiceオブジェクトはWSDLの情報を保持します。

(2) Callオブジェクトの生成

Callオブジェクトは次の手順で生成します。

  1. ポートのQNameオブジェクトを生成します。wsdl:port要素の名前空間URIを名前空間URIとして,wsdl:port要素のname属性をローカル名として,引数に指定します。

  2. オペレーションのQNameオブジェクトを生成します。wsdl:operation要素の名前空間URIを名前空間URIとして,wsdl:operation要素のname属性をローカル名として,引数に指定します。

  3. Service#createCall(QName portName, QName operationName)メソッドを使用して,Callインスタンスを生成します。引数に1.および2.で生成したオブジェクトを指定します。

    ここで生成されたCallオブジェクトは,Serviceオブジェクトが保持するWSDLの情報を保持します。

(3) プロパティの設定

必要に応じて,Call#setPropertyメソッドを使用してプロパティを設定します。設定できるプロパティについては,「13.3 C4Propertyクラス(実行時オプションの設定)」のsetPropertyメソッドの説明を参照してください。

(4) パラメタの生成

パラメタは次の手順で生成します。メソッドのパラメタには,「12.2.6 DII使用時のサポート範囲」に示すJavaデータ型を指定できます。

  1. (2)で生成したCallオブジェクトをcom.cosminexus.cws.xml.rpc.Call型へキャストします。

    com.cosminexus.cws.xml.rpc.CallインタフェースのgetParameterClassByName(String paramName)メソッドの引数に,オペレーションのパラメタのローカル名を指定し,パラメタのJava型のClassオブジェクトを取得します。

  2. パラメタのJava型のオブジェクトを生成します。

    パラメタでプリミティブ型およびJava標準クラスを使用する場合

    1.取得したパラメタのJava型が,WSDLのパラメタのデータ型に対応するJava型と一致するか確認します。

    2.Java型が一致した場合,Java型のオブジェクトを生成します。

    パラメタでユーザ定義のデータ型クラスを使用する場合

    1.XMLの複合型から完全修飾Javaクラス名を生成します。クラス名は複合型の名前空間URIと複合型の名前から生成します。

    2.取得したパラメタのJava型のクラス名が,生成したクラス名と一致するか確認します。

    3.クラス名が一致した場合,取得したパラメタのJava型のClassオブジェクトから,java.lang.Class#newInstance()メソッドを使用してオブジェクトを生成します。

    4.複合型に定義した子要素の名前と型から,ユーザ定義のデータ型クラスのアクセサの名前を取得します。リフレクションを使用してアクセサを呼び出し,ユーザ定義のデータ型クラスのプロパティを設定します。なお,アクセサについては,「3.8.3(2) WSDLとユーザ定義のデータ型クラスのマッピング」を参照してください。

    パラメタで配列を使用する場合

    1.取得したパラメタのJava型が,XMLの配列に対応するJava配列型と一致するか確認します。

    2.Java型が一致した場合,リフレクションを使用して配列を生成します。

(5) SOAPサービスの呼び出し

SOAPサービスは次の手順で呼び出します。

  1. (4)で生成したパラメタを要素として持つObject配列を生成します。

  2. Call#invoke(Object[] inputParams)メソッドを使用して,サービスを呼び出します。引数には,1.で生成したObject配列を指定します。

  3. 戻り値を取得します。

  4. RemoteExceptionがスローされた場合は,必要な処理を行います。

(6) 戻り値の処理

戻り値は次の手順で処理します。メソッドの戻り値には,「12.2.6 DII使用時のサポート範囲」に示すJavaデータ型を指定できます。

  1. 戻り値のオブジェクトからjava.lang.Object#getClass()メソッドを使用して,戻り値のJava型のClassオブジェクトを取得します。

  2. 戻り値のオブジェクトから値を取得します。

    戻り値でプリミティブ型およびJava標準クラスを使用する場合

    1.取得した戻り値のJava型が,WSDLの戻り値のデータ型に対応するJava型と一致するか確認します。

    2.Java型が一致した場合,リフレクションを使用して戻り値のオブジェクトから値を取得します。

    戻り値でユーザ定義のデータ型クラスを使用する場合

    1.XMLの複合型から完全修飾Javaクラス名を生成します。クラス名は複合型の名前空間URIと複合型の名前から生成します。

    2.取得した戻り値のJava型のクラス名が,生成したクラス名と一致するか確認します。

    3.クラス名が一致した場合,複合型に定義した子要素の名前と型から,ユーザ定義のデータ型クラスのアクセサの名前を取得します。リフレクションを使用してアクセサを呼び出し,ユーザ定義のデータ型クラスのプロパティを取得します。なお,アクセサについては,「3.8.3(2) WSDLとユーザ定義のデータ型クラスのマッピング」を参照してください。

    戻り値で配列を使用する場合

    1.取得した戻り値のJava型が,XMLの配列に対応するJava配列型と一致するか確認します。

    2.Java型が一致した場合,リフレクションを使用して配列の要素を生成します。

(7) 例外の処理

次の手順で例外を処理します。例外には,ユーザ定義例外クラスを指定できます。

  1. RemoteExceptionからC4Fault例外を取得します。

  2. C4Fault例外からユーザ定義例外を取得します。

    C4Fault例外にユーザ定義例外が含まれる場合

    リフレクションを使用してユーザ定義例外の情報を取得します。取得方法は,「3.8.2(6) 戻り値の処理」の2.「戻り値でユーザ定義のデータ型クラスを使用する場合」を参照してください。

    C4Fault例外にユーザ定義例外が含まれない場合

    C4Fault例外からSOAP Faultの情報を取得します。