5.3.1 Cosminexus XML Processorを使用した送信メッセージの生成

複雑なXMLデータを生成する必要がある場合や,あらかじめ用意されたXMLデータを利用する場合は,Cosminexus XML Processorで必要なXMLデータを生成したあとに,SAAJに取り込む方法を推奨します。

Cosminexus XML Processorで作成したDOMオブジェクト(XMLデータ)を埋め込んだSOAPメッセージを作成する場合,次の手順で処理してください。

  1. Cosminexus XML Processorを使用して,DOMドキュメントのデータを作成します。
  2. 送信するメッセージのSOAPPartオブジェクトにあるimportNodeメソッドで,データを変換します。
  3. SAAJを使用して,変換したデータを追加します。
    追加先は,SOAPボディ要素の下,SOAPヘッダ要素の下,またはSOAP FaultのDetail要素の下にしてください。SOAPボディ要素やSOAPヘッダ要素そのものを変換することはできません。
  4. 作成したメッセージを送信します。
    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 (Cosminexus 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 (Cosminexus 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;
   }
}