SOAPメッセージを送信する送信アプリケーションは、サーバシステムからの復帰情報としてFaultメッセージを受信する場合があります。SAAJ-APIではFaultはSOAPFaultオブジェクトとして表されます。SOAPFaultオブジェクトはSOAPMessageオブジェクト中のSOAPBodyオブジェクトの子要素として設定されます。
Faultを起こすアプリケーションはSOAPBody.addFaultメソッドでSOAPFaultオブジェクトを生成し、Faultを受けるアプリケーションはSOAPBody.getFaultメソッドでSOAPFaultオブジェクトを取り出すことができます。また送信アプリケーションはSOAPBody.hasFaultメソッドで受信したSOAPMessageオブジェクト中にFaultがあるかどうかを判定できます。
SOAPFaultオブジェクトには以下の情報が保持され、アプリケーションではそれらの情報を設定・取得できます。
Faultコード/Fault説明/Faultアクタの操作をする場合は、必ずSOAPFaultクラスのset系メソッド(setFaultXXXXX)を使用してください。SOAPElement.addTextNodeでは、情報を設定できません。
Faultコード(java.lang.String)
Fault説明(java.lang.String)
Faultアクタ(java.lang.String)
Fault詳細(javax.xml.soap.Detail)
import javax.xml.soap.*; import java.util.Iterator; .... MessageFactory mf = MessageFactory.newInstance(); SOAPMessage msg = mf.createMessage(); SOAPPart part = msg.getSOAPPart(); SOAPEnvelope env = part.getEnvelope(); env.getHeader().detachNode(); SOAPBody body = env.getBody(); ..... // SOAPFaultを設定する場合 SOAPFault fault = body.addFault(); fault.setFaultActor(Faultアクタ); fault.setFaultCode(Faultコード); fault.setFaultString(Fault説明); Detail detail = fault.addDetail(); DetailEntry entry = detail.addDetailEntry( ..... ); entry.addChildElement(...); ..... SOAPMessage reply = .....; // Faultが発生したかを判定 env = reply.getSOAPPart().getEnvelope(); body = env.getBody(); if( body.hasFault() ) { // Fault発生 fault = body.getFault(); String faultActor = fault.getFaultActor(); String faultCode = fault.getFaultCode(); String faultString = fault.getFaultString(); detail = fault.getDetail(); Iterator it = detail.getDetailEntries(); while( it.hasNext() ){ entry = (DetailEntry)it.next(); ...... } } else{ // 正常処理 ..... }
SOAPFaultインタフェースはSOAPBodyの子要素を表すSOAPBodyElementインタフェースを継承しています。SOAPFault,SOAPFaultElement,Detail,DetailEntryの各インタフェースは、SOAPElementインタフェースを継承していますので、通常のSOAPメッセージの組み立てと同じようにFault情報を組み立てることができます。