現在、送信クライアント側メッセージ中に javax.xml.ws.handler.soap.SOAPHandler の既存の SOAPHeader に org.w3c.dom.Element をアタッチしようとすると、次のエラーが発生します。
org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: ノードを作成したドキュメントとは別のドキュメントでノードが使用されています
この問題は、handleMessage() 関数内から別の Web サービスに対して別の jax-ws クライアント呼び出しを行った場合にのみ発生します。いくつかの質問に答えるために、Element オブジェクトをアタッチしようとするときに、Element オブジェクトを適切にインポートして複製していますが、上で述べたように、その後の Web サービス呼び出しを行わない限り、正常に実行できます。クライアント側の呼び出しと Web サービスの両方が JBoss EAP 5.1 で実行されています。考え?提案?使用例を以下に示します。
public boolean handleMessage(SOAPMessageContext ctx) {
Boolean outbound = (Boolean) msgContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if(!outbound)
{
SOAPPart document = ctx.getMessage().getSOAPPart();
SOAPHeaderElement wsse = getSecurityHeaderElement(document.getEnvelope());
//Extra Webservice call
Service service=Service.create(wsdlUrl,qname);
WebserviceInterface ws=service.getPort(WebserviceInterface.class);
ws.helloWorld();
//End of other webservice call
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder= factory.newDocumentBuilder();
Document doc=docBuilder.newDocument();
//Insert appending nodes here
Element xmlElement=doc.getDocumentElement();
Node node = document.importNode(xmlElement.cloneNode(true),true);
wsse.appendChild(node);
}
}
私を最も困惑させているのは、この他のWebサービス呼び出しが元のWebサービスSOAPHeaderに影響を与えないはずですが、Webサービス呼び出しを削除すると問題が解決することです。