Cosminexus SOAPアプリケーション開発ガイド

[目次][用語][索引][前へ][次へ]

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) クッキーについて

(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サービスのインタフェースクラスのインスタンスを破棄することなく,継続して使用してください。