RPC形態のSOAPアプリケーション開発時の注意事項について説明します。EJBを利用している場合は,「3.12 EJB利用時の注意事項」もあわせて参照してください。
RPC形態,メッセージング形態,およびEJB形態のSOAPサービスで,同一のサービス名は指定しないでください。同一のサービス名のSOAPサービスがデプロイされていると,予期しない動作をするおそれがあります。
WSDL中の<output>要素に記述されているデータ型は,ソース生成時にHolderクラスになります。
例えば,string(http://www.w3.org/2001/XMLSchema)を<output>要素に記述した場合,javax.xml.rpc.holders.StringHolderクラスが生成されます。
stringを例に,Holderクラスの使用例を次に示します。
public void get(javax.xml.rpc.holders.StringHolder inout0)
{
java.lang.String value = inout0.value;
}
public void set(javax.xml.rpc.holders.StringHolder out0)
{
out0.value = new java.lang.String("test");
}
WSDL定義でデータ型にanyTypeを使用した場合,実行時オプションのデータ型定義オプション(send_xsi_types)の設定に関係なく,送信するSOAPメッセージ中にデータ型が含まれます。SOAP通信基盤を他社のSOAP製品と接続する場合はSOAPメッセージ中にデータ型を含めるようにしてください。anyType型のデータを受信する場合に,SOAPメッセージ中にデータ型が含まれていないとC4Fault例外が発生する場合があります。
SOAP通信基盤では,SOAPサービスのエンドポイントURLに「?WSDL」を付与したURLに対してHTTP GETプロトコルを使用しても,WSDLファイルを取得できません。HTTP GETプロトコルを使用してWSDLファイルを取得できるようにする場合は,SOAPサービスを含むWARファイルにWSDLファイルを格納し,該当するファイルを表すURLに対してHTTP GETプロトコルを使用するようにしてください。
use属性にLITERAL,そしてTypeMappingVersionに1.2を指定して生成されたWSDLまたはWSDDを使用して通信する場合,SOAPメッセージ中の要素にxsi:type属性が付与されることがあります。
use属性にENCODED,そしてTypeMappingVersionに1.1を指定して生成されたWSDLまたはWSDDを使用して通信する場合,SOAPメッセージ中の要素にSOAPエンコーディングのデータ型情報が付与されることがあります。
SOAP符号化規則にリテラルエンコーディングを使用したSOAPメッセージを送受信する場合,多重参照オプションにtrueを設定しても有効になりません。多階層となるようなSOAPメッセージが送受信できなくなることがあります。多階層となるようなSOAPメッセージを送受信したい場合は,SOAP符号化規則にSOAPエンコーディングを使用してください。
DeployScopeを「Session」にしたSOAPアプリケーションを開発する場合,SOAP通信基盤に対してセッション終了を要求するサービスメソッドを用意できます。このサービスメソッド内でSOAP通信基盤が提供する「C4Sessionのinvalidateメソッド」を呼び出すことで,SOAP通信基盤に対してセッション終了を要求できます。クライアント側の処理では,セッション終了を希望するタイミングでこのサービスメソッドを呼び出してください。
SOAPアプリケーションのインタフェースの例を次に示します。
package localhost;
public interface UserInfo extends java.rmi.Remote {
// サービスメソッド
localhost.UserData getUserData(java.lang.String user_no) throws java.rmi.RemoteException;
// セッション終了用サービスメソッド
public void endSession() throws java.rmi.RemoteException;
}
サービス側の処理の実装例を次に示します。
package localhost;
public class UserInfoSoapBindingImpl implements localhost.UserInfo {
// サービスメソッド
public localhost.UserData getUserData(java.lang.String user_No) throws java.rmi.RemoteException {
// サービスメソッド実装を記述
}
// セッション終了用サービスメソッド
public void endSession() throws java.rmi.RemoteException {
// セッション終了時の処理を記述
// セッション終了要求を通知するAPIを使用する
try {
C4Session session = C4Session.getInstance();
if (session != null) {
session.invalidate();
}
}
catch (java.lang.RuntimeException e) {
// エラー処理
}
}
}
クライアント側の処理の実装例を次に示します。
package localhost;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import com.cosminexus.cws.management.*;
public class RPCSampleClient extends HttpServlet
{
...
// サービスのインタフェースクラスのオブジェクトを生成
UserInfoServiceLocator uis = new UserInfoServiceLocator();
// スタブのインタフェースクラスのオブジェクトを生成
UserInfo ui = uis.getUserInfo();
// サービスメソッドを呼び出す
UserData ud1 = ui.getUserData(strUserNo1); // セッション開始
UserData ud2 = ui.getUserData(strUserNo2); // セッション継続
// セッション終了用サービスメソッドを呼び出す
ui.endSession(); // セッション終了要求
...
}
Webサーバから受け取ったクッキーは,SOAPサービスのインタフェースクラスのインスタンスで保持されます。クッキーを利用する場合,SOAPサービスのメソッドを呼び出すたびに,SOAPサービスのインタフェースクラスのインスタンスを破棄することなく,継続して使用してください。
expires属性で設定したクッキーの有効期限に達しても,SOAPクライアントライブラリは保持しているクッキーを削除しません。期限切れのクッキーを受け取っても処理できるようにサーバで対処してください。
SOAPアプリケーション開発支援機能で開発したSOAPクライアントおよびSOAPサービス以外と通信する場合,WSDLで定義されたpartアクセサ要素が存在しないSOAPメッセージを送信させないでください。
RPC形態のアプリケーションで,WSDLで定義されたpartアクセサ要素が存在しないSOAPメッセージを受信した場合,SOAPアプリケーションは,パラメタとしてnullを受け取ります。SOAPサービスがSOAPフォルトを返信する,またはSOAPクライアントが例外を受け取ることはありません。