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;

     }
    }
   }
  }
 }


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

Copyright 2003 FUJITSU LIMITED