2
我們有調用另一個web服務(如jaxws)的web服務(jaxws)。 Jaxws客戶端配置看起來像這樣 -cxf攔截器,偵聽器和webservice(jaxws)之間的通信
<jaxws:client id="helloClient"
serviceClass="demo.spring.HelloWorld"
address="http://localhost:9002/HelloWorld" >
<jaxws:outInterceptors>
<bean class="com.company.MyOutInterceptor"/>
</jaxws:outInterceptors>
<jaxws:inFaultInterceptors>
<bean class="com.company.MyInFaultInterceptor"/>
</jaxws:inFaultInterceptors>
<cxf:properties>
<entry key="org.apache.cxf.logging.FaultListener">
<bean class="com.company.MyFaultListener"/>
</entry>
</cxf:properties>
</jaxws:client>
正如您所看到的,我們有兩個攔截器和一個故障監聽器。我們希望在這些攔截器,錯誤監聽器和Web服務代碼之間進行通信。 如在SO THREAD中給出的,我們使用cxf Exchange對象來進行web服務和攔截器之間的通信。
我們inFaultInterceptor代碼看起來象 -
public class MyInFaultInterceptor extends AbstractPhaseInterceptor<Message> {
public MyInFaultInterceptor() {
super(Phase.RECEIVE);
}
public void handleMessage(Message message) {
message.getExchange().put("key", "value");
}
}
出Web服務代碼看起來就像這樣 -
public String addNumbers(int a, int b){
try{
myService.add(a,b);
}catch(MyServiceException e){
//Logging
}
Object value = PhaseInterceptorChain.getCurrentMessage().getExchange().get("key");
}
但是,詮釋Web服務代碼,我們正在對於給定的「密鑰」爲空,表示「密鑰」不存在。
有沒有什麼方法可以在攔截器和 網絡服務之間進行通信?
P.S:我們可以在攔截器和偵聽器中使用上述方法進行通信。也就是說,我們可以訪問inFaultInterceptor中的outInterceptor 中的密鑰集,但在任何攔截器 或listener中設置的密鑰不能在Web服務中訪問。
'PhaseInterceptorChain'使用'ThreadLocal'存儲信息。 Exchange Messsage可能在攔截器鏈完成後被使用和清理,並且無法通過'PhaseInterceptorChain.getCurrentMessage()恢復它' – pedrofb