2011-08-02 66 views
9

我在創建輸出攔截器的階段,並從SOAP消息中獲取OuputStream。但是,我怎麼才能在發送到端點之前修改SOAP信封?我想刪除一些xml元素。如何修改生成的SOAP請求?

回答

3

一種方式可能是獲取文檔並通過XSLT轉換運行它。

你可以通過調用

@Override 
public void handleMessage(SoapMessage message) throws Fault{ 
    SOAPMessage saaj = message.getContent(SOAPMessage.class); 
    Document doc = saaj.getSOAPPart(); // This actually returns a SOAPPart instance but it does implement the w3c Document interface 

    //play around with the document, doc is a reference so any changes made to that instance 
    //will be forwarded to the rest of the chain 
} 

小心在你的攔截器的的handleMessage文件得到的是,如果你有安全功能,如XML簽名必須在皁含量進行,你必須確保你的攔截器發生在應用簽名之前,否則您將使其無效。

要使用攔截器的時機,您可以指定它將運行的階段。 CXF還應該遵守您將在相同階段執行的配置順序。

,但不要把我的話...檢查這些更多信息

調試通過CXF的源代碼也幫了我很大的瞭解它是如何工作的

----編輯----

(謝謝丹尼爾:-)

爲了這個工作,你需要在你的堆棧中配置SAAJOutInterceptor。你可以手動添加它,或者簡單地將它作爲攔截器的一部分。 Here is一個攔截器的例子,幾乎不需要你想要的。

+0

非常感謝您的回答Newtopian。 message.getContent(SOAPMessage.class)總是返回Null,但是:-(我應該在哪個階段讓這個代碼訪問SOAP Envelope? – kiwifrog

+2

您還需要在SAAJOutInterceptor中進行配置,以及進行轉換的攔截器 –

+1

事實上,Daniel是對的,你需要確保SAAJOutInterceptor被配置爲將數據序列化爲SOAPMessage對象。默認情況下,它與我的設置一樣,所以我不必擔心太多。該對象將不再爲空,您將可以隨意使用DOM樹。 – Newtopian