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

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

6.3.2 Fault詳細項目からのCORBA例外の取得

 CORBAサーバアプリケーション(コンポーネント・トランザクションサーバアプリケーションを含む)から通知されたCORBA例外は、あらかじめ決めれらたFault詳細項目に情報が設定されています。

 名前空間名:com.fujitsu.interstage.soap.gateway.CORBAException

ローカル名

Javaのデータ型

説明

id

String

例外クラス名。CORBA/SOAPサーバゲートウェイから通知された例外クラス名が設定されています。

major

int

1:CORBAユーザ定義例外
2:CORBAシステム例外

minor

int

CORBAシステム例外のマイナーコードが設定されています。
CORBAシステム例外が通知された場合にのみ有効です。

status

int

CORBAシステム例外を通知したメソッドの状態が設定されています。
CORBAシステム例外が通知された場合にのみ有効です。
org.omg.CORBA..CompletionStatus._COMPLETED_MAYBE:完了状態不明
org.omg.CORBA..CompletionStatus._COMPLETED_YES:メソッド完了
org.omg.CORBA..CompletionStatus._COMPLETED_NO:メソッド未完了

message

String

CORBAシステム例外の詳細情報が設定されています。
CORBAシステム例外が通知された場合にのみ有効です。

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

 
 以下のIDL定義から作成されたCORBAサーバアプリケーションのaddメソッドを呼び出した場合のFault詳細項目取得についてのコーディング例を示します。
 コーディング例では、CORBAシステム例外クラスをFault詳細項目:idに設定された例外クラス名からjava.lang.Class.forName()でjava.lang.Classを取得しCORBAシステム例外のインスタンスを作成しています。
 module ODdemo{
  interface calculator{
   exception ZEROPARAM {};
   struct result {
    long add_result;
    long subtract_result;
    long multiple_result;
    float divide_result;
   };

   result calculate( in long a, in long b ) raises( ZEROPARAM );
     :
  };
 };
 

 // 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", "ODdemo-calculator-ZEROPARAM" );
 // ユーザ定義例外  ZEROPARAMのマッピング登録
  tm.register(ODdemo.calculatorPackage.ZEROPARAMSOAPGWType.class, _qname,
     new com.fujitsu.interstage.soapx.encoding.ser.BeanSerializerFactory(
      ODdemo.calculatorPackage.ZEROPARAMSOAPGWType.class, _qname),
     new com.fujitsu.interstage.soapx.encoding.ser.BeanDeserializerFactory(
      ODdemo.calculatorPackage.ZEROPARAMSOAPGWType.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 _ex_id = null;
   int _ex_major = 0;
   int _ex_minor = 0;
   int _ex_status = org.omg.CORBA.CompletionStatus._COMPLETED_MAYBE;
   String _ex_message = null;

 //CORBA例外用Faults詳細項目 QName作成
   String NS_URI_CORBAException = "com.fujitsu.interstage.soap.gateway.CORBAException";
   QName Q_CORBAEXCEPTION_ID = new QName( NS_URI_CORBAException, "id" );
   QName Q_CORBAEXCEPTION_MAJOR =
       new QName( NS_URI_CORBAException, "major" );
   QName Q_CORBAEXCEPTION_MINOR =
       new QName( NS_URI_CORBAException, "minor" );
   QName Q_CORBAEXCEPTION_STATUS =
       new QName( NS_URI_CORBAException, "status" );
   QName Q_CORBAEXCEPTION_MESSAGE =
       new QName( NS_URI_CORBAException, "message" );

   Iterator _it = _detail.getChildElements();
   if( _it != null ) {
    while(_it.hasNext()) {
     SOAPElement _elm = (SOAPElement)_it.next();
     String _elmName = _elm.getElementName().getLocalName();
     if( _elmName.equals("id")) {
      _ex_id = _elm.getValue();
     }
     else if( _elmName.equals("major")){
      _ex_major = new Integer(_elm.getValue()).intValue();
     }
     else if( _elmName.equals("minor")) {
      _ex_minor = new Integer(_elm.getValue() ).intValue();
     }
     else if( _elmName.equals("status")) {
      _ex_status = new Integer(_elm.getValue() ).intValue();
     }
     else if( _elmName.equals("message")) {
      _ex_message = _elm.getValue();
     }
    } // while
 // CORBA例外の作成
    if( _ex_id != null ) {
     java.lang.Object _ex_obj = null;
     try {
      java.lang.Class _ex_class = java.lang.Class.forName( _ex_id );
      _ex_obj = _ex_class.newInstance();
     } catch( java.lang.ClassNotFoundException nie ) {
       : //_ex_idで示すクラスが見つからなかった場合の例外処理を記述
     } catch( java.lang.InstantiationException nie ) {
       : //_exクラスのインスタンスを作成できなかった場合の例外処理を記述
     } catch( java.lang.IllegalAccessException nie ) {
       : //_exクラスまたは_exクラスのコンストラクタにアクセス
       : //できなかった場合の例外処理を記述
     }
 // SystemException
     if( _ex_obj instanceof org.omg.CORBA.SystemException ) {
       ((org.omg.CORBA.SystemException)_ex_obj).minor = _ex_minor;
       ((org.omg.CORBA.SystemException)_ex_obj).completed =
           org.omg.CORBA.CompletionStatus.from_int( _ex_status );
              // 作成したCORBAシステム例外をthrowする
              throw (org.omg.CORBA.SystemException)_ex_obj;
     }
    }
   }
  }
 }

 ユーザ定義例外クラス(ZEROPARAM)をFault詳細項目から取り出すコーディング例を以下に示します。Fault詳細項目からユーザ定義例外クラスの情報を取り出す方法は

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

の2種類の方法があります。

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

 // 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", "ODdemo-calculator-ZEROPARAM" );
 // ユーザ定義例外 ZEROPARAMのマッピング登録
  tm.register(ODdemo.calculatorPackage.ZEROPARAMSOAPGWType.class, _qname,
     new com.fujitsu.interstage.soapx.encoding.ser.BeanSerializerFactory(
      ODdemo.calculatorPackage.ZEROPARAMSOAPGWType.class, _qname),
     new com.fujitsu.interstage.soapx.encoding.ser.BeanDeserializerFactory(
      ODdemo.calculatorPackage.ZEROPARAMSOAPGWType.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詳細項目の取得
   Iterator _it = _detail.getChildElements();
   if( _it != null ) {
    while(_it.hasNext()) {
     SOAPElement _elm = (SOAPElement)_it.next();
     String _elmName = _elm.getElementName().getLocalName();
     if( _elmName.equals("ODdemo-calculator-ZEROPARAM")) {
 //
 // 例外クラスの各メンバ情報を取得しユーザ定義例外クラスを構築する方法
 //
      ODdemo.calculatorPackage.ZEROPARAMSOAPGWType excep;
 // ユーザ定義例外クラスの作成
      excep = new ODdemo.calculatorPackage.ZEROPARAMSOAPGWType();
      _it = _elm.getChildElements();
 // ユーザ定義例外クラスのメンバ情報の取得
 // ユーザ定義例外クラスに定義されたメンバ名でメンバ情報を取得します
 // getValue()はString型を返すためメンバの型に合わせて変更します
      while(_it.hasNext()) {
       _elm = (SOAPElement)_it.next();
       _elmName = _elm.getElementName().getLocalName();
       if( _elmName.equals("例外クラスのメンバ名を指定する")) {
           // 例外クラスのメンバ名がString型の場合の設定
        excep.例外クラスのメンバ名 = _elm.getValue();
       }
       else if( _elmName.equals("例外クラスのメンバ名を指定する")) {
           // 例外クラスのメンバ名がint型の場合の設定
        excep.例外クラスのメンバ名 = (new Integer((String)_elm.getValue())).intValue();
       }
      } // while
 // 例外クラスのスロー
      throw excep;

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


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

Copyright 2003 FUJITSU LIMITED