2012-01-24 47 views
0

我正在JBoss6服務器上運行基於Apache CXF 2.3.1的JAX-WS Web服務。Apache CXF:將信息從攔截器轉發到實際的web服務實現

我的服務提供功能getWeight。根據SOAP頭中的附加信息,該函數應該以不同的單位(公斤,磅)返回值。爲了這個目的我已經加入我自己的攔截:

public class MySoapHeaderInterceptor extends AbstractSoapInterceptor 
{ 
    public MySoapHeaderInterceptor() 
    { 
     super(Phase.USER_PROTOCOL); 
    } 

    ... 
} 

攔截工作正常,我可以從SOAP頭解析額外的元素,可以建立基於此元素的變量:

boolean poundsRequested = true; 

現在我的問題發生。我不知道如何將變量poundsRequested轉發給我的實際WebService實現MyServiceImpl。這個類正在調用另一個類ValueReader,我最終需要SOAP頭中的信息。

我已經嘗試設置一個全局靜態變量ValueReader.poundsRequested。但是這樣的解決方案不是線程安全的。可能會發生兩個客戶端的調用發生干擾,並且可能會覆蓋其他設置變量。

總結:我基本上需要從Apache CXF攔截器轉發變量到實際的web服務實現的可能性。而且這個變量的值需要對每個請求都是唯一的。

+0

Waitaminute ...你在標題中傳遞真實的功能信息? –

回答

0

理想情況下,請求權重的格式應該是您的有效負載的一部分 - 它是沒有意義的,它是一個頭。

如果您使用的是JAX-WS(推薦CXF),那麼您可能不需要獲取該頭的攔截器,您可以使用@WebParam批註將頭標屬性設置爲true來獲得此信息。

+0

是的,在標題中設置這些信息可能不是最好的,但由於其他一些原因,我不得不遵循這種方法。還有一些其他信息在SOAP標頭中傳遞,我面臨同樣的問題。爲了方便我的文章,我忽略了他們。 我不想遵循@ WebParam-Notation。這將改變WSDL中函數的簽名。標題內的額外元素應該是可選的。 –

2

在攔截器,你可以保存你需要傳入消息的值:

1)有標準JAXWS:

 
message.put("my.value", value); 

內,您的實現,你可以做兩件事情之一WebServiceContext通過@Resource注入的事情,並呼籲

 
context.getMessageContext().get("my.value"); 

2)既然你是綁CXF無論如何,這樣做:

 
PhaseInterceptorChain.getCurrentMessage().get("my.value"); 
+0

謝謝丹尼爾。你的文章非常幫助我!我選擇了選項1.基本上我已經閱讀過這個想法。我的執行過程中遇到了一些其他問題,這使得很難應用該想法。好吧,我最終重組了我的實現:) –