2010-03-16 57 views
1

NB-6.8 jdk-1.6.14 WSS4j-1.5.8,OpenSAML-2.3.0 我嘗試修改WSS4J-1.5.8以運行SAML 2.0,但無法插入所產生的斷言到現有SOAP頭部,這樣的代碼:如何向SOAPHeader插入SAML聲明

Assertion assertion = createAssertion("some subject", "some issuer"); 

    Document doc = docBuilder.parse("request.xml"); 

    Element parent = doc.getDocumentElement(); 

    Node node = parent.getElementsByTagName("soapenv:Header"); 
    node.appendChild(assertion.getDOM()); 

錯誤:WRONG_DOCUMENT_ERR:一個節點在不同的文檔比創建它的一個使用。

但在wss4j中,一些像insertSecurityHeader這樣的函數也是這樣做的(appendChild或inserBefore)。他們工作,爲什麼我的代碼錯了?我想念的是什麼。

+1

在您要查找的所有者文檔上認爲它的importNode()。 – 2010-03-16 22:21:47

+0

它沒有用。我沒有看到任何元素被添加到文檔,雖然它應該像javadoc說。 – mono 2010-03-17 02:35:07

+0

我最近遇到了類似的問題。在我的情況下,這是因爲缺少一些命名空間。 – JST 2010-04-22 16:34:37

回答

0

實際上,我遇到了使用importNode(NAMESPACE_ERR)的問題,它可以使用adoptNode來解決。

2

問題是斷言的擁有者文檔與節點的擁有者文檔不同。要解決此問題,節點的所有者文檔必須先取得斷言的所有權,然後才能追加它。 正如ralph指出的那樣,您可以使用node.getOwnerDocument().adoptNode(assertion)來解決該問題。