【问题标题】:WRONG_DOCUMENT_ERR when attaching Element to SOAP Header将元素附加到 SOAP 标头时出现 WRONG_DOCUMENT_ERR
【发布时间】:2013-05-25 06:47:32
【问题描述】:

目前,当我在传出客户端消息期间尝试将 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 服务调用,问题就会消失。

【问题讨论】:

  • 请显示您正在使用的代码。你说你正确地导入了元素 - 但是没有看到代码,我们无法判断这是否正确,而且很明显可能会出错。
  • 我可以这样做,但如果我没有正确导入它,删除额外的 web 服务调用如何允许导入工作?
  • @JonSkeet - 我添加了一些代码来显示正在发生的导入。不过,我不知道这会有什么不同,因为删除 web 服务调用允许导入没有问题。很奇怪。
  • @JonSkeet - 此外,如果我将 web 服务调用移回函数中的第一个操作,则处理程序甚至无法检索 SecurityHeaderElement 并出现相同的错误。
  • getSecurityHeaderElement是你自己的方法吗?如果是这样,它有什么作用?如果不是,它来自哪里?虽然我不明白为什么其他 Web 服务调用也会导致问题,但我们知道的越多,我们就能越多地帮助您。

标签: java soap jax-ws webservice-client soaphandler


【解决方案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);
      }
}   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 2021-12-26
    • 2014-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-25
    相关资源
    最近更新 更多