[英]Apache CXF: Forwarding an information from an interceptor to the actual webservice implementation
我正在JBoss6服務器上運行基於Apache CXF 2.3.1的JAX-WS 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 Interceptor轉發到實際的webservice實現。 此外,此變量的值對於每個請求都必須是唯一的。
在攔截器中,您可以保存傳入消息所需的值:
message.put("my.value", value);
在您的實現中,您可以執行以下兩項操作之一:
1)通過@Resource事件注入標准的JAXWS WebServiceContext並調用
context.getMessageContext().get("my.value");
2)既然你被綁在CXF上,那么:
PhaseInterceptorChain.getCurrentMessage().get("my.value");
理想情況下,請求權重的格式應該是有效負載的一部分 - 它作為標題是沒有意義的。
您可能不需要攔截器來獲取此標頭,如果您使用的是JAX-WS(推薦使用CXF),您可以使用@WebParam注釋並將header屬性設置為true來實現此目的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.