2013-05-29 19 views
1

當我嘗試在傳出期間將org.w3c.dom.Element附加到javax.xml.ws.handler.soap.SOAPHandler中的現有SOAPHeader時,目前出現以下錯誤客戶端消息:將元素附加到SOAP標題時的WRONG_DOCUMENT_ERR

org.w3c.dom.DOMException中:WRONG_DOCUMENT_ERR:一個節點在不同的文檔而不是創建它

所述一個用於

只有當我使一個單獨的JAX-WS客戶呼叫時發生此問題到handleMessage()函數內的另一個web服務。爲了回答一些問題,我正在導入並克隆Element對象,試圖附加它,並且可以成功地做到這一點,只要我不進行後續的web服務調用,如上所述。我的客戶端調用和webservice都在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服務調用應的SOAPHeader,但同樣對始發的WebServices 0的效果,如果我刪除了Web服務調用問題消失。

+0

請顯示您正在使用的代碼。你*說*你正在正確導入元素 - 但是沒有看到代碼,我們無法判斷這是否是真實的,這是顯而易見的事情,可能會出錯。 –

+0

我可以做到這一點,但如果我沒有正確導入它如何刪除額外的web服務調用允許導入工作? – dsutherland

+0

@JonSkeet - 我添加了一些代碼來顯示導入發生。不過,我不知道這樣做會如何消除因爲刪除web服務調用允許導入發生沒有問題。這很奇怪。 – dsutherland

回答

1

因此,經過進一步的分析,事實證明,從handleMessage()方法內調用webservice不是問題;然而,在handleMessage()階段特別實例化任何web服務的新實例是導致該問題的原因。仍然不確定爲什麼這是一個問題(猜測它是一個APACHE XERCES或JBoss 5.1的bug),但這裏是一個如何工作的例子。

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