WRONG_DOCUMENT_ERR при присоединении элемента к заголовку SOAP

В настоящее время я получаю следующую ошибку, когда я пытаюсь присоединить org.w3c.dom.Element к существующему SOAPHeader в javax.xml.ws.handler.soap.SOAPHandler во время исходящего сообщения на стороне клиента:

org.w3c.dom.DOMException: WRONG_DOCUMENT_ERR: узел используется в документе, отличном от того, который его создал

Эта проблема возникает только в том случае, если я выполняю отдельный вызов клиента jax-ws другому веб-сервису из функции handleMessage(). Чтобы ответить на некоторые вопросы, я правильно импортирую и клонирую объект Element при попытке присоединить его и могу сделать это успешно, если я не выполняю последующий вызов веб-службы, как я уже говорил выше. И мой клиентский вызов, и веб-сервис работают на 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);
    }
}   

Что меня больше всего беспокоит, так это то, что этот другой вызов веб-службы должен иметь нулевой эффект на исходный SOAPHeader веб-служб, но, опять же, если я удалю вызов веб-службы, проблема исчезнет.

1 ответ

Решение

Таким образом, после дальнейшего анализа выясняется, что вызов веб-сервиса из метода handleMessage() не является проблемой; однако именно создание нового экземпляра любого веб-сервиса на этапе handleMessage() является причиной проблемы. Все еще не уверен, почему это проблема (предполагаю, что это ошибка в 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);
      }
}   
Другие вопросы по тегам