簡體   English   中英

Apache CXF:將攔截器中的信息轉發到實際的Web服務實現

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM