2013-02-12 54 views
1

在將Jax-WS生成的SOAP消息發送到服務器之前,是否可以將其作爲字符串操作?我想在發送和修改一些標籤之前截取消息。將soap消息作爲字符串操縱

我想這樣做,因爲我需要發送一個SOAP請求到服務器。這個請求的標籤有很多xml文檔作爲其內容。對於每個文檔,我需要在某些標記中重新聲明命名空間(Jax-WS智能地僅聲明一次)。我不能使用任何前綴。我也需要簽署xml。如果我可以將消息作爲一個字符串來處理,所有這些問題將更容易解決。

我已經看到類似的軸,但我沒有找到如何用Jax-WS做到這一點。

謝謝。

更新:我已經嘗試使用處理程序(SOAP和邏輯處理程序)。我的問題是,即使在使用處理程序修改它之後,Jax-WS也會更改該消息。我的SOAP消息的身體需要看起來像這樣:

<soap12:Body> 
    <cteDadosMsg xmlns="http://www.portalfiscal.inf.br/cte/wsdl/CteRecepcao"> 
     <enviCTe xmlns="http://www.portalfiscal.inf.br/cte" versao="1.04"> 
     <idLote>1</idLote> 
     <CTe xmlns="http://www.portalfiscal.inf.br/cte"> 
     </CTe> 
     <CTe xmlns="http://www.portalfiscal.inf.br/cte"> 
     </CTe> 
     </enviCTe> 
    </cteDadosMsg> 
</soap12:Body> 

看我的CTE標籤需要重複命名空間聲明(由enviCTe使用的相同)。我試圖執行以下步驟:

1)使用Jaxb創建包含環境的文檔。

2)將其轉換爲字符串並調整CTe標記的名稱空間聲明(使用String.replace)。

3)將xml字符串添加到cteDadosMsg。 Jax-WS轉義字符(例如替換<爲&lt;)。 Web服務不理解具有轉義字符的xml。

4)增加了一個LogicalHandler來消除負載(替換&lt;,<等)。

5)完成此操作後,Jax-WS再次調整名稱空間聲明,並且CTe標記的xmlns屬性消失。 :P這是我的問題。 Jax-WS甚至在用處理程序修改消息後「修復」該消息。

除了將Jaxb生成的xml作爲字符串添加外,我還嘗試將其添加爲Document。我沒有轉義的問題,但我仍然無法爲每個CTe標籤重複命名空間聲明。 當我解決這個問題時,我仍然必須簽署一些xml標籤。所以我真的想在發送消息之前攔截消息並將其修改爲字符串。 我錯過了什麼嗎?

回答

2

您可以使用Handlers來做同樣的事情。有關更多詳細信息,請參閱here

+0

嗨Jayamohan,謝謝你的答案。我試圖使用處理程序,但它不起作用。我更新了我原來的問題,解釋了原因...... – 2013-02-12 13:04:21