将元素附加到SOAP报头时出现错误



目前,当我试图附加一个org.w3c.dom时,我得到以下错误。元素在客户端传出消息期间,将SOAPHeader转换为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);
    }
}   

最让我困惑的是,这个其他的web服务调用应该对原始的web服务SOAPHeader有0的影响,但是如果我再次删除这个web服务调用,问题就会消失。

因此,经过进一步分析,事实证明,从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);
      }
}   

最新更新