3.11 RPC形態のSOAPアプリケーション開発時の注意事項

RPC形態のSOAPアプリケーション開発時の注意事項について説明します。EJBを利用している場合は,「3.12 EJB利用時の注意事項」もあわせて参照してください。

<この節の構成>
(1) SOAPアプリケーションのサービス名に関する注意
(2) WSDL定義とHolderクラスの対応について
(3) anyType型のデータ型の送信に関する注意
(4) GETプロトコルを使用したWSDLファイルの取得に関する注意
(5) LITERAL指定時のSOAPメッセージに関する注意
(6) ENCODED指定時のSOAPメッセージに関する注意
(7) リテラルエンコーディングと多重参照オプション(do_multirefs)に関する注意
(8) DeployScopeを「Session」にしたSOAPアプリケーションに関する注意
(9) クッキーについて
(10) クッキーの有効期限について
(11) WSDLで定義されたpartアクセサ要素が存在しないSOAPメッセージに関する注意

(1) SOAPアプリケーションのサービス名に関する注意

RPC形態,メッセージング形態,およびEJB形態のSOAPサービスで,同一のサービス名は指定しないでください。同一のサービス名のSOAPサービスがデプロイされていると,予期しない動作をするおそれがあります。

(2) WSDL定義とHolderクラスの対応について

WSDL中の<output>要素に記述されているデータ型は,ソース生成時にHolderクラスになります。

例えば,string(http://www.w3.org/2001/XMLSchema)を<output>要素に記述した場合,javax.xml.rpc.holders.StringHolderクラスが生成されます。

stringを例に,Holderクラスの使用例を次に示します。

(3) anyType型のデータ型の送信に関する注意

WSDL定義でデータ型にanyTypeを使用した場合,実行時オプションのデータ型定義オプション(send_xsi_types)の設定に関係なく,送信するSOAPメッセージ中にデータ型が含まれます。SOAP通信基盤を他社のSOAP製品と接続する場合はSOAPメッセージ中にデータ型を含めるようにしてください。anyType型のデータを受信する場合に,SOAPメッセージ中にデータ型が含まれていないとC4Fault例外が発生する場合があります。

(4) GETプロトコルを使用したWSDLファイルの取得に関する注意

SOAP通信基盤では,SOAPサービスのエンドポイントURLに「?WSDL」を付与したURLに対してHTTP GETプロトコルを使用しても,WSDLファイルを取得できません。HTTP GETプロトコルを使用してWSDLファイルを取得できるようにする場合は,SOAPサービスを含むWARファイルにWSDLファイルを格納し,該当するファイルを表すURLに対してHTTP GETプロトコルを使用するようにしてください。

(5) LITERAL指定時のSOAPメッセージに関する注意

use属性にLITERAL,そしてTypeMappingVersionに1.2を指定して生成されたWSDLまたはWSDDを使用して通信する場合,SOAPメッセージ中の要素にxsi:type属性が付与されることがあります。

(6) ENCODED指定時のSOAPメッセージに関する注意

use属性にENCODED,そしてTypeMappingVersionに1.1を指定して生成されたWSDLまたはWSDDを使用して通信する場合,SOAPメッセージ中の要素にSOAPエンコーディングのデータ型情報が付与されることがあります。

(7) リテラルエンコーディングと多重参照オプション(do_multirefs)に関する注意

SOAP符号化規則にリテラルエンコーディングを使用したSOAPメッセージを送受信する場合,多重参照オプションにtrueを設定しても有効になりません。多階層となるようなSOAPメッセージが送受信できなくなることがあります。多階層となるようなSOAPメッセージを送受信したい場合は,SOAP符号化規則にSOAPエンコーディングを使用してください。

(8) DeployScopeを「Session」にした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(); // セッション終了要求

   ...
}

(9) クッキーについて

Webサーバから受け取ったクッキーは,SOAPサービスのインタフェースクラスのインスタンスで保持されます。クッキーを利用する場合,SOAPサービスのメソッドを呼び出すたびに,SOAPサービスのインタフェースクラスのインスタンスを破棄することなく,継続して使用してください。

(10) クッキーの有効期限について

expires属性で設定したクッキーの有効期限に達しても,SOAPクライアントライブラリは保持しているクッキーを削除しません。期限切れのクッキーを受け取っても処理できるようにサーバで対処してください。

(11) WSDLで定義されたpartアクセサ要素が存在しないSOAPメッセージに関する注意

SOAPアプリケーション開発支援機能で開発したSOAPクライアントおよびSOAPサービス以外と通信する場合,WSDLで定義されたpartアクセサ要素が存在しないSOAPメッセージを送信させないでください。

RPC形態のアプリケーションで,WSDLで定義されたpartアクセサ要素が存在しないSOAPメッセージを受信した場合,SOAPアプリケーションは,パラメタとしてnullを受け取ります。SOAPサービスがSOAPフォルトを返信する,またはSOAPクライアントが例外を受け取ることはありません。