Interstage Application Server SOAPサービス ユーザーズガイド
目次 索引 前ページ次ページ

第6章 CORBA/SOAPゲートウェイの実装> 6.4 EJBアプリケーションと連携する場合の留意事項

6.4.4 Fault詳細項目からの例外クラスの取得

 EJBサーバアプリケーションから通知された例外はFault詳細項目に情報が設定されています。
 以下を指定してFault詳細項目を取得し、例外クラス情報を取得してください。

 
 以下のようなリモートインタフェースが定義され、subメソッドが例外クラスpack1.SubExceptionをスローするように定義されている場合のFault詳細項目取得についてのコーディング例を示します。
 Fault詳細項目から例外情報を取り出すには

  1. 例外クラスの各メンバ情報を取得し、例外クラスを構築する方法
  2. Interstage SOAPサービスが提供する拡張APIを使用して例外クラスを取得する方法

の2種類の方法があります。
 例外クラスに複数のメンバが定義される場合は(2)の方法を使用することで処理の簡素化が行えます。

 // リモートインタフェース定義
 package pack1;
 import java.rmi.*;
 import javax.ejb.*;

 public class calcBean implements javax.ejb.SessionBean {
     :
   public int sub(int a, int b)  throws pack1.SubException {
     :
   }
     :
 }

 // 例外クラス定義
 public class SubException extends java.lang.Exception {
     :
   public String detailMessage;
   public int detailCode;

   public SubException() { }
     :
 }
 // import文宣言
 import javax.xml.rpc.Service;
 import javax.xml.rpc.ServiceFactory;
 import javax.xml.rpc.soap.SOAPFaultException;
 import javax.xml.rpc.encoding.TypeMappingRegistry;
 import javax.xml.rpc.encoding.TypeMapping;
 import javax.xml.soap.Detail;
 import javax.xml.soap.DetailEntry;
 import javax.xml.namespace.QName;
 import java.util.Iterator;
 import javax.xml.soap.SOAPElement;
     :
 try {
     :
   Service service = null;
   service = ServiceFactory.newInstance().createService(new QName("",""));
   TypeMappingRegistry tmr = service.getTypeMappingRegistry();
   TypeMapping tm = tmr.createTypeMapping();
   // 例外クラス QName作成
   QName _qname = 
         new QName( "urn:Fujitsu-Soap-Service-Data", "pack1-SubExceptionSOAPGWType" );
   // 例外クラスのマッピング登録
   tm.register(pack1.SubException.class, _qname,
         new com.fujitsu.interstage.soapx.encoding.ser.BeanSerializerFactory( 
            pack1.SubException.class, _qname),
            new com.fujitsu.interstage.soapx.encoding.ser.BeanDeserializerFactory( 
            pack1.SubException.class, _qname ) );

   // マッピング情報をマッピングレジストリへ登録
   tmr.register( "http://schemas.xmlsoap.org/soap/encoding/", tm );
     :
   // メソッド呼び出し
   ..... = call.invoke( ... );
     :
 } catch( javax.xml.rpc.ServiceException e ) {
     :
 } catch( SOAPFaultException e ) {
 // Fault情報の取得
   QName _faultCode = e.getFaultCode();
   String _faultString = e.getFaultString();
   String _faultActor = e.getFaultActor();
   Detail _detail = e.getDetail();
   if( _detail != null ){
   // Fault詳細項目の取得
     String  _detailMessage = null;
     int  _detailCode = 0;

     Iterator _it = _detail.getChildElements();
     if( _it != null ) {
       while(_it.hasNext()) {
         SOAPElement _elm = (SOAPElement)_it.next();
         String _elmName = _elm.getElementName().getLocalName();
         // 例外クラス情報の判定
         if( _elmName.equals("pack1-SubExceptionSOAPGWType")) {
   //
   // 例外クラスの各メンバ情報を取得し例外クラスを構築する方法
   //
           pack1.SubException excep;
           _it = _elm.getChildElements();
   // 例外クラスのメンバ情報の取得
   // 例外クラスに定義されたメンバ名でメンバ情報を取得する
           while(_it.hasNext()) {
             _elm = (SOAPElement)_it.next();
             _elmName = _elm.getElementName().getLocalName();
             if( _elmName.equals("detailMessage")) {
               _detailMessage = _elm.getValue();
             }
             else if( _elmName.equals("detailCode")) {
               _detailCode = (new Integer((String)_elm.getValue())).intValue();
             }
           }

   // 例外クラスの作成
           excep = new pack1.SubException();
   // 例外クラスメンバ情報の設定
           excep.detailMessage = _detailMessage;
           excep.detailCode = _detailCode;
   // 例外クラスのスロー
           throw excep;

   //
   // Interstage SOAPサービスが提供する拡張APIを使用して例外クラスを取得する方法
   //
           QName ExcepQName = 
            new QName( "urn:Fujitsu-Soap-Service-Data",
                       "pack1-SubExceptionSOAPGWType" );
           java.lang.Object excep;
   // 例外クラスの取得
           try {
             excep = ((com.fujitsu.interstage.soapx.message.SOAPElementImpl)_elm)
                        .getValueAsType(ExcepQName);
           } catch( java.lang.Exception ee ) {
                  :   //  取り出しに失敗した場合の処理を記述
           }
   // 例外クラスのスロー
           throw (pack1.SubException)excep;

         }
       }
     }
   }
 }

目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005