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);
}
}