5.3.1 XML Processorを使用した送信メッセージの生成
複雑なXMLデータを生成する必要がある場合や,あらかじめ用意されたXMLデータを利用する場合は,XML Processorで必要なXMLデータを生成したあとに,SAAJに取り込む方法を推奨します。
XML Processorで作成したDOMオブジェクト(XMLデータ)を埋め込んだSOAPメッセージを作成する場合,次の手順で処理してください。
-
XML Processorを使用して,DOMドキュメントのデータを作成します。
-
送信するメッセージのSOAPPartオブジェクトにあるimportNodeメソッドで,データを変換します。
-
SAAJを使用して,変換したデータを追加します。
追加先は,SOAPボディ要素の下,SOAPヘッダ要素の下,またはSOAP FaultのDetail要素の下にしてください。SOAPボディ要素やSOAPヘッダ要素そのものを変換することはできません。
-
作成したメッセージを送信します。
SAAJに変換したデータは,SAAJのインタフェースを使って変更しないで,そのまま送信してください。
インポートしたデータに,SOAPヘッダのヘッダ属性が含まれる場合は,その値がそのまま送信されます。ただし,SOAPヘッダ要素の直下の要素で,mustUnderstand属性を省略した場合には,次のデフォルト定義が自動的に付加されます。
mustUnderstand="0"
ヘッダ属性を利用する場合,デフォルト値を意識して,定義がある場合でもない場合でも,正しく処理できるようにユーザプログラムを作成してください。
送信メッセージのSOAPボディ要素の下にXMLを追加する場合のコーディング例を次に示します。
import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPMessage; import javax.xml.soap.SOAPPart; import org.w3c.dom.Document; import org.w3c.dom.Node; public class Sample1 { /** * Documentオブジェクトのルート要素をSOAPボディ要素の下に格納する。 * * @param msg 格納先の SOAPMessage (MessageFactoryで作成しただけのもの) * @param doc 格納元の Document (XML Processorで作成したもの) * @return 格納先の SOAPMessage */ public SOAPMessage sample(SOAPMessage msg, Document doc) { try { SOAPPart part = msg.getSOAPPart(); // DOMのNodeオブジェクトを取り出しSAAJオブジェクトに変換する Node source = doc.getDocumentElement(); SOAPElement e = (SOAPElement)part.importNode(source, true); // メッセージのSOAPBodyの下に追加する SOAPBody body = msg.getSOAPBody(); e = body.addChildElement(e); } catch (Exception e) { // 省略 } return msg; } }
送信メッセージのSOAP FaultのDetail要素下に,XMLを追加する場合のコーディング例を次に示します。
import javax.xml.soap.Detail; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPElement; import javax.xml.soap.SOAPFault; import javax.xml.soap.SOAPMessage; import javax.xml.soap.SOAPPart; import org.w3c.dom.Document; import org.w3c.dom.Node; public class Sample2 { /** * Documentオブジェクトのルート要素をDetail要素の下に格納する。 * * @param msg 格納先の SOAPMessage (MessageFactoryで作成しただけのもの) * @param doc 格納元の Document (XML Processorで作成したもの) * @return 格納先の SOAPMessage */ public SOAPMessage sample(SOAPMessage msg, Document doc) { try { SOAPPart part = msg.getSOAPPart(); // DOMのNodeオブジェクトを取り出しSAAJオブジェクトに変換する Node source = doc.getDocumentElement(); SOAPElement e = (SOAPElement)part.importNode(source, true); // メッセージのSOAPFault中のDetail要素の下に追加する SOAPBody body = msg.getSOAPBody(); SOAPFault fault = body.addFault(); Detail detail = fault.addDetail(); e = detail.addChildElement(e); // faultString, faultActor, faultCodeなどを設定する fault.setFaultString("sample error"); // 省略 } catch (Exception e) { // 省略 } return msg; } }