目前,当我在传出客户端消息期间尝试将 org.w3c.dom.Element 附加到 javax.xml.ws.handler.soap.SOAPHandler 中的现有 SOAPHeader 时出现以下错误:
org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: 一个节点在与创建它的文档不同的文档中使用
仅当我从 handleMessage() 函数中对另一个 Web 服务进行单独的 jax-ws 客户端调用时,才会出现此问题。为了回答一些问题,我在尝试附加它时正确地导入和克隆了 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 的影响应该为 0,但是如果我删除 web 服务调用,问题就会消失。