9.7.7 サービスリクエスタ(SOAP受付)の作成手順(JAX-WSエンジン)
SOAP受付に要求を出すサービスリクエスタとして,JAX-WSエンジンを使用して通信するサービスリクエスタを作成できます。JAX-WSエンジンを使用して通信するサービスリクエスタは,SOAP(document-literal型)を利用して,SOAP受付に要求電文を送信します。
JAX-WSエンジンの場合のサービスリクエスタとHCSCサーバの関係を次の図に示します。
JAX-WSエンジンを使用して通信するサービスリクエスタの作成手順を次に示します。
各工程の作業を次に示します。
(2) サービスクラスの生成
編集したWSDLからサービスクラスを生成します。サービスクラスは,サービスプラットフォームが開発支援コマンドとして提供するcjwsimportコマンドで生成します。
コマンドの入力例を次に示します。
cjwsimport -s <ソースファイルの出力先ディレクトリ> -d <コンパイル済みクラスファイルの出力先ディレクトリ> <WSDLファイル>
cjwsimportコマンドのオプションなどの詳細については,マニュアル「アプリケーションサーバ Webサービス開発ガイド」の「14.1.1 cjwsimportコマンド」を参照してください。
なお,「(1) WSDLの編集」で編集したWSDLファイルが,cjwsimportコマンドを実行するカレントディレクトリと異なる場所に格納されている場合は,ディレクトリも指定してください。
このコマンドを実行すると,WSDLに記述されている内容に基づいて,指定したソースファイルの出力先ディレクトリに,ディレクトリおよびファイルが生成されます。
- 注意事項
-
JAX-WSエンジンを使用して通信するサービスリクエスタの場合,プログラム実行時にWSDLを読み込みます。サービスクラスのデフォルトコンストラクタを使用する場合は,cjwsimportコマンドで指定したWSDLのパス(「(1) WSDLの編集」で取得したWSDLファイルをサービスクラス生成のために格納したディレクトリ)のWSDLを読み込みます。そのため,cjwsimportコマンドを実行したあと,サービスクラスを基点としたWSDLファイルの構成位置は,相対関係を壊すような構成にならないよう,WSDLファイルを移動しないでください。サービスリクエスタ実行時に参照するWSDLの構成位置を,cjwsimportコマンドで指定したWSDLのパスから変更する場合は,URLを指定できるコンストラクタを使用してください。
(3) オブジェクトの生成
SOAP受付のメソッドを呼び出すために,生成したサービスクラスを使用して,プロキシクラスのオブジェクトを生成します。
生成したサービスクラスを基に,SOAP受付を呼ぶためのプロキシクラスのオブジェクトを生成する手順を示します。
-
サービスクラスを生成します。
-
wsdl:portTypeに対応するプロキシクラスを生成します。
-
生成したプロキシクラスのオブジェクトを使用して,サービスのメソッドを呼び出します。
生成したオブジェクトのメソッドを呼び出すことで,SOAP受付にサービス部品の実行が要求されます。サービスクラスのオブジェクト内で,WSDLで定義された形式の要求電文(SOAPメッセージ)を自動生成します。
(5) エラー情報の取得
要求先のサービス部品,HCSCサーバ,およびSOAPエンジンでエラーが発生した場合,エラー情報を取得し,その情報に従って対処します。
- サービス部品からのSOAP Faultの取得方法
-
JAX-WSエンジンを使用して通信するサービスリクエスタの場合,情報がラップされた例外がキャッチされます。そのため,ユーザ定義例外を取得するには,getFaultInfo()メソッドを使用してフォルト情報の格納クラスを取得する必要があります。
- HCSCサーバ内で発生した例外の取得方法
-
javax.xml.ws.soap.SOAPFaultExceptionオブジェクトをキャッチしてエラー情報を取得します。
サービスリクエスタ側の処理の流れを次に示します。
-
SOAPFaultExceptionでキャッチします。
-
SOAPFaultExceptionからgetFault()メソッドを使用してSOAP Faultを取り出します。
-
SOAP FaultからSOAPフォルトの情報を取り出します。
HCSCサーバ内で発生した例外を取得する場合の,サービスリクエスタ側の実装の例を次に示します。
/** * Sample Program */ { try { : } catch (xxxxxxxxxxException_Exception e) { // WSDLに定義しているSOAPフォルトが返ってきた場合 xxxxxxxxxxException faultInfo = e.getFaultInfo(); : } catch (SOAPFaultException e) { // HCSCサーバ内で何らかのエラーが発生した場合 SOAPFault soapFault = e.getFault(); if(soapFault != null) { // SOAPフォルトの情報を出力 System.err.println("faultCode=" + soapFault.getFaultCode()); System.err.println("faultActor=" + soapFault.getFaultActor()); System.err.println("faultString=" + soapFault.getFaultString()); Detail detail = soapFault.getDetail(); if(detail != null) { for(Iterator ite = detail.getDetailEntries(); ite.hasNext(); ) { printDetail((Element)ite.next()); } } } } }
なお,getDetail()メソッドを使用して取得したElement[]の構造は,次の表のようになります。
表9‒20 getDetail()メソッドを使用して取得したElement[]の構造 名称
内容
errorMessage
例外に設定されているエラーメッセージです。
errorCode
例外に設定されているエラーメッセージに対応するエラーコードです。
processInstanceID
ビジネスプロセスのプロセスインスタンスIDです。メッセージング基盤内で検出したエラーの場合は設定されていないためnull(nil属性)となります。ビジネスプロセスで発生したエラーの場合に該当します。
-