Interstage Application Server SOAPサービス ユーザーズガイド |
目次 索引 |
第6章 CORBA/SOAPゲートウェイの実装 | > 6.3 CORBAアプリケーションと連携する場合の留意事項 |
CORBAサーバアプリケーション(コンポーネント・トランザクションサーバアプリケーションを含む)から通知されたCORBA例外は、あらかじめ決めれらたFault詳細項目に情報が設定されています。
名前空間名:com.fujitsu.interstage.soap.gateway.CORBAException
ローカル名 |
Javaのデータ型 |
説明 |
---|---|---|
id |
String |
例外クラス名。CORBA/SOAPサーバゲートウェイから通知された例外クラス名が設定されています。 |
major |
int |
1:CORBAユーザ定義例外 |
minor |
int |
CORBAシステム例外のマイナーコードが設定されています。 |
status |
int |
CORBAシステム例外を通知したメソッドの状態が設定されています。 |
message |
String |
CORBAシステム例外の詳細情報が設定されています。 |
CORBAユーザ定義例外の場合、CORBAサーバアプリケーションから通知された例外クラスがFault詳細項目に設定されています。以下を指定してFault詳細項目を取得し、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詳細項目からユーザ定義例外クラスの情報を取り出す方法は
の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 } } } |
目次 索引 |