複雑なXMLデータを生成する必要がある場合や,あらかじめ用意されたXMLデータを利用する場合は,Cosminexus XML Processorで必要なXMLデータを生成したあとに,SAAJに取り込む方法を推奨します。
Cosminexus XML Processorで作成したDOMオブジェクト(XMLデータ)を埋め込んだSOAPメッセージを作成する場合,次の手順で処理してください。
インポートしたデータに,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;
}
}