10.7.7 サービスリクエスタ(ユーザ定義受付(Webサービス))の作成手順(JAX-WSエンジン)
ユーザ定義受付(Webサービス)に要求を出すサービスリクエスタとして,JAX-WSエンジンを使用して通信するサービスリクエスタを作成できます。JAX-WSエンジンを使用して通信するサービスリクエスタは,SOAP(document-literal型)を利用して,ユーザ定義受付(Webサービス)に要求電文を送信します。
JAX-WSエンジンの場合のサービスリクエスタとHCSCサーバの関係を次の図に示します。
図10-34 JAX-WSエンジンを使用して通信するサービスリクエスタとHCSCサーバの関係(ユーザ定義受付(Webサービス))
![[図データ]](figure/zc100700.gif)
JAX-WSエンジンを使用して通信するサービスリクエスタの作成手順を次に示します。
図10-35 JAX-WSエンジンを使用して通信するサービスリクエスタの作成手順(ユーザ定義受付(Webサービス))
![[図データ]](figure/zc100800.gif)
各工程の作業を次に示します。
- <この項の構成>
- (1) WSDLの編集
- (2) サービスクラスの生成
- (3) オブジェクトの生成
- (4) 応答電文の取得
- (5) エラー情報の取得
(1) WSDLの編集
WSDLの編集方法は,SOAP通信基盤でサービスリクエスタを作成する場合と同じです。
WSDLの編集方法については,「10.7.2 WSDLを編集する」を参照してください。
(2) サービスクラスの生成
編集したWSDLからサービスクラスを生成します。サービスクラスは,Cosminexusが開発支援コマンドとして提供するcjwsimportコマンドで生成します。
コマンドの入力例を次に示します。
cjwsimport -s <ソースファイルの出力先ディレクトリ> -d <コンパイル済みクラスファイルの出力先ディレクトリ> <WSDLファイル> |
cjwsimportコマンドのオプションなどの詳細については,マニュアル「Cosminexus アプリケーションサーバ Webサービス開発の手引」の「11.1 cjwsimportコマンド」を参照してください。
なお,「10.7.7(1) WSDLの編集」で編集したWSDLファイルが,cjwsimportコマンドを実行するカレントディレクトリと異なる場所に格納されている場合は,ディレクトリも指定してください。
このコマンドを実行すると,WSDLに記述されている内容に基づいて,指定したソースファイルの出力先ディレクトリに,ディレクトリおよびファイルが生成されます。
- 注意
- JAX-WSエンジンを使用して通信するサービスリクエスタの場合,プログラム実行時にWSDLを読み込みます。サービスクラスのデフォルトコンストラクタを使用する場合は,cjwsimportコマンドで指定したWSDLのパス(「10.7.7(1) WSDLの編集」で取得したWSDLファイルをサービスクラス生成のために格納したディレクトリ)のWSDLを読み込みます。そのため,cjwsimportコマンドを実行したあと,サービスクラスを基点としたWSDLファイルの構成位置は,相対関係を壊すような構成にならないよう,WSDLファイルを移動しないでください。サービスリクエスタ実行時に参照するWSDLの構成位置を,cjwsimportコマンドで指定したWSDLのパスから変更する場合は,URLを指定できるコンストラクタを使用してください。
(3) オブジェクトの生成
ユーザ定義受付(Webサービス)のメソッドを呼び出すために,生成したサービスクラスを使用して,プロキシクラスのオブジェクトを生成します。
生成したサービスクラスを基に,ユーザ定義受付(Webサービス)を呼ぶためのプロキシクラスのオブジェクトを生成する手順を示します。
- サービスクラスを生成します。
- wsdl:portTypeに対応するプロキシクラスを生成します。
- 生成したプロキシクラスのオブジェクトを使用して,サービスのメソッドを呼び出します。
生成したオブジェクトのメソッドを呼び出すことで,ユーザ定義受付にサービス部品の実行が要求されます。サービスクラスのオブジェクト内で,WSDLで定義された形式の要求電文(SOAPメッセージ)を自動生成します。
(4) 応答電文の取得
応答電文の取得方法は,SOAP通信基盤でサービスリクエスタを作成する場合と同じです。
応答電文の取得については,「10.7.5 応答電文を取得する」を参照してください。
(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[]の構造は,次の表のようになります。
表10-20 getDetail()メソッドを使用して取得したElement[]の構造
名称 | 内容 |
---|
errorMessage | 例外に設定されているエラーメッセージです。 |
errorCode | 例外に設定されているエラーメッセージに対応するエラーコードです。 |
processInstanceID | ビジネスプロセスのプロセスインスタンスIDです。メッセージング基盤内で検出したエラーの場合は設定されていないためnull(nil属性)となります。ビジネスプロセスで発生したエラーの場合に該当します。 |