当我尝试在传出客户端消息期间将org.w3c.dom.Element附加到javax.xml.ws.handler.soap.SOAPHandler中的现有SOAPHeader时,我收到以下错误:
org.w3c.dom.DOMException:WRONG_DOCUMENT_ERR:节点用于与创建节点不同的文档中
只有在我从handleMessage()函数中对另一个Web服务进行单独的jax-ws客户端调用时,才会出现此问题。为了回答一些问题,我正在尝试附加它时正确地导入和克隆Element对象,并且只要我没有按照上面的说明进行后续的webservice调用就可以成功执行。我的客户端调用和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);
}
}
最令我困惑的是,这个其他的webservice调用应该对原始webservices SOAPHeader产生影响,但是如果我删除webservice调用,问题就会消失。
答案 0 :(得分:1)
因此,经过进一步分析,结果是在handleMessage()方法中调用web服务不是问题;但是,在handleMessage()阶段专门实例化任何web服务的新实例是导致问题的原因。仍然不确定为什么这是一个问题(猜测它是APACHE XERCES或JBoss 5.1的一个错误),但这是一个如何工作的例子。
private WebserviceInterface ws;
//Assuming this method is only called when not handling a message
public void init()
{
Service service=Service.create(wsdlUrl,qname);
ws=service.getPort(WebserviceInterface.class);
}
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
Element xmlElement=ws.helloWorld();
Node node = document.importNode(xmlElement.cloneNode(true),true);
wsse.appendChild(node);
}
}