SOAPを利用した通信ができない場合の,考えられる原因や対処方法について示します。
アプリケーションログを出力するには,動作定義ファイルの設定が必要になります。「10. 動作定義ファイルおよび実行時オプションの設定項目」を参照して,動作定義ファイルが正しく設定されているかを確認してください。特に次に示す点に注意してください。
メソッド呼び出しで例外が発生していないか確認してください。また,ほかのメソッドやほかのSOAPサービスで,SOAPメッセージが正しく出力されているかどうかを確認することで,特定のメソッド呼び出しだけの問題かどうか確認できます。
メソッドを呼び出すときに,SOAPクライアントライブラリが動作しているかどうかを確認するには,トレースファイルを利用できます。出力されるトレースファイルのメッセージテキストの次に示すキーワードを参照することで,どこまで動作しているか把握できます。
トレースファイルに出力される形式に関しては,「14.4 トレースファイル」を参照してください。
クライアントからSOAPメッセージが正しく出力されているのに,サーバにSOAPメッセージが届かない場合は,送信先の指定が間違っているおそれがあります。クライアントからスタブを利用するときに指定する送信先URLを確認してください。次に送信先URLの例を示します。
http://hostname:8080/WebApp1/services/UserInfo
送信先URLの形式,ポート番号,コンテキストルートの指定内容などが正しいか確認してください。
また,Webサーバが正しく動作しているか確認してください。SOAPによる通信ができないだけでなく,HTMLファイルが表示できない場合は,通信路に問題がないかについても確認してください。
サーバにSOAPメッセージが届いているのに,正しいSOAPメッセージを返せない場合は,送信されたSOAPメッセージの内容が正しいか,および送信されたSOAPメッセージが正しく処理されているか確認します。
送信されたSOAPメッセージの内容が正しいかについては,アプリケーションログの内容を確認してください。送信されたSOAPメッセージが,SOAPサービスとして公開しているサービスに対応したものかどうかや,メソッド名,パラメタ名,およびパラメタに指定している内容などを確認してください。
SOAPメッセージがSOAPサービスで正しく処理されているかの確認は,サーバトレースを利用できます。出力されたファイルに記述された次のキーワードを参照することで,どこまで動作しているか把握できます。
トレースファイルに出力される形式に関しては,「14.4 トレースファイル」を参照してください。
また,ユーザが作成するSOAPサービスの実装そのものが正しく動作しているかどうかについても確認してください。
サーバから返信用SOAPメッセージが正しく出力されない場合は,SOAPサービスで処理した結果として正しいSOAPメッセージを返せないことが考えられます。「14.8(4) SOAPサービスでメッセージを処理できません。どのように対処すればよいですか?」を参照し,送信されてきたSOAPメッセージの内容が正しいか,およびそのメッセージを正しく処理できているか確認してください。
SOAPサービスでは正しく処理できているのに,クライアントへ意図したSOAPメッセージが届いていない場合は,サーバトレースおよびクライアントトレースによって,SOAPメッセージの内容が正しいか,およびそのメッセージが正しく処理されているかを確認してください。トレースファイルの確認方法については,次に示す内容を参照してください。
クライアントに返信用SOAPメッセージが届いているのに,クライアント側で処理できない場合は,クライアントトレースによって,SOAPメッセージの内容が正しいか,およびそのメッセージが正しく処理されているかを確認してください。トレースファイルの確認方法については,「14.8(2) クライアントからSOAPメッセージが正しく出力されません。どのように対処すればよいですか?」を参照してください。
Cosminexusで提供しているクライアント以外のクライアントでは,SOAP 1.1に対するサポート範囲や解釈の違いから,Cosminexusで提供するSOAP通信基盤で扱えない形式のSOAPメッセージを出している可能性があります。Cosminexus SOAP通信基盤が扱えるSOAP 1.1の範囲については,「12.1 SOAP 1.1との対応」を参照してください。
Cosminexusで提供しているクライアント以外のクライアントと,Cosminexus上で動作しているSOAPサービス間の通信ができない場合,クライアント部分に関してはご使用のクライアントから提供される情報に従って対処してください。
Cosminexusが提供しているSOAP通信基盤のサポート範囲外のSOAPメッセージか,Cosminexus以外のクライアントの動作に問題があるかを切り分けるには,同じWSDLを利用してCosminexusのSOAPクライアントライブラリからCosminexus上で動作しているSOAPサービスへの通信ができるかどうかを試すのが有効です。
また,サポート範囲外のメッセージを出していないか,および内容に問題ないかを確認するには,ご使用のクライアントとCosminexusのSOAPクライアントライブラリを使用した場合に出力されるメッセージの比較が有効です。CosminexusのSOAPクライアントライブラリを使用した場合のメッセージの確認は,アプリケーションログを参照してください。アプリケーションログについては,「14.5 アプリケーションログ」を参照してください。
利用できます。外部のSOAPサービスを利用する場合,クライアント定義ファイルのプロキシオプションに必要な情報を設定します。プロキシオプションの設定項目については,「10.6.6 プロキシオプション」を参照してください。クライアント定義ファイルの設定については,「10.3 クライアント定義ファイルの設定」を参照してください。
設定できます。RPC形態のSOAPアプリケーションを例に,SOAPAction値を設定する方法を説明します。
RPC形態の場合,WSDL内でSOAPAction値を指定する個所を直接変更して,そのWSDLからスタブのソースコードを自動生成することで,送信メッセージのSOAPAction値を指定します。Java2WSDLコマンドでWSDLを生成すると,SOAPAction値はデフォルトで「""」が設定されます。次に,SOAPAction値の指定個所を抜粋したWSDLの例を示します。
<wsdl:binding name="UserInfoSoapBinding" type="intf:UserInfo">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="getUserData">
<soap:operation soapAction="" />
<wsdl:input>
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost" use="literal" />
</wsdl:input>
<wsdl:binding name="UserInfoSoapBinding" type="intf:UserInfo">
<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="getUserData">
<soap:operation soapAction="http://localhost" />
<wsdl:input>
<soap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://localhost" use="literal" />
</wsdl:input>
次のように,呼び出すサービスのURLにユーザIDとパスワードを指定することで,ユーザ認証が必要なSOAPサービスを呼び出すことができます。
http://<ユーザID>:<パスワード>@<ホスト名またはIPアドレス>:<ポート番号>/・・・
なお,SOAP通信基盤では,BASIC認証だけに対応しています(DIGEST/FORM/CLIENT-CERT認証には対応していません)。
次に,ユーザIDとパスワードを指定する実装例を示します。
UserInfoServiceLocator uis = new UserInfoServiceLocator();
java.net.URL endpoint = new java.net.URL("http://user1:pass1@hostname:8080/WebApp1/services/UserInfo");
UserInfo ui = uis.getUserInfo(endpoint);
メッセージング形態のSOAPアプリケーションを利用してください。RPC形態のSOAPアプリケーションでは,配列の要素を省略したSOAPメッセージを生成することはできません。
配列要素の省略とは,SOAPメッセージ中で,配列にoffsetを指定した場合,positionを指定した場合,配列要素にnil値を指定した場合,配列のサイズよりも要素の数が少なかった場合です。
他社製品のクライアントから接続する場合などで,配列要素の省略を含んだSOAPメッセージを受け取るRPCサービスを実装するときの注意点を次に示します。
RPC呼び出しの引数として,int[]やdouble[]のように,Javaの基本データ型を要素に持つ配列を使用した場合,配列要素が省略されていると,サービスからSOAP Faultが返ります。
表14-15 基本データ型配列要素が省略されていた場合のSOAP Faultの内容
SOAP Faultの要素 | 内容 |
---|---|
faultcode | {http://c4web.cosminexus.com}:Server.userException |
faultstring | KDCCF9000-E C4Fault exception occurred. Detail = java.lang.NullPointerException |
faultactor | なし |
detail | なし |
RPCサービス実装で配列要素の省略を使用しなくてはならない場合は,配列要素に基本データ型のラッパークラスを使用してください。
基本データ型のラッパークラスとは,java.lang.Integerクラスやjava.lang.Doubleクラスなどの,基本データ型の値を格納することのできるクラスです。
配列要素がクラスである場合,省略された要素にはnull値が格納されます。
SSLを使用するためには,暗号化に使用する鍵を格納するキーストアや証明書を格納するトラストストアを用意し,それらの情報をSOAPクライアント実行時に設定する必要があります。また,SSL認証の種類によって必要となるストア情報が異なります。次にSSL認証の種類と,それに必要なストア情報の関係を示します。
表14-16 SSL認証の種類とストア情報の関係
認証の種類 ※1 | キーストア情報 ※2 | トラストストア情報 ※2 | ||
---|---|---|---|---|
キーストア | キーストア パスワード | トラストストア | トラストストア パスワード | |
サーバ認証 | - | - | ○ | ○ |
クライアント認証 | ○ | ○ | ○ ※3 | ○ ※3 |
相互認証 | ○ | ○ | ○ | ○ |
Cosminexusを使用する場合は,usrconf.propertiesに必要なプロパティを設定します。usrconf.propertiesについては,マニュアル「Cosminexus アプリケーションサーバ リファレンス 定義編(サーバ定義)」を参照してください。
次に使用例を示します。
コマンドラインを使用する場合は,-Dオプションを利用して必要なプロパティを設定します。次に使用例を示します。
%java -Djavax.net.ssl.keyStore=<キーストアの絶対パス>
-Djavax.net.ssl.keyStorePassword=<キーストアパスワード>
-Djavax.net.ssl.trustStore=<トラストストアの絶対パス>
-Djavax.net.ssl.trustStorePassword=<トラストストアパスワード>
<SOAPクライアントクラス>
性能解析トレースを出力するには,動作環境に応じた設定が必要です。「14.7.3 性能解析トレース使用時の注意事項」を参照して,動作環境を正しく設定してください。