Hitachi

Cosminexus V11 アプリケーションサーバ SOAPアプリケーション開発の手引


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

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

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

  1. 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 (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;
    }
}