2016-07-08 107 views
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服務中訪問。

+0

'PhaseInterceptorChain'使用'ThreadLocal'存儲信息。 Exchange Messsage可能在攔截器鏈完成後被使用和清理,並且無法通過'PhaseInterceptorChain.getCurrentMessage()恢復它' – pedrofb

回答

1

不知道是否有任何CXF在建的機制,我用ThreadLocal通過Web服務方法和攔截器之間的信息,

public final class KPContextHolder { 

    private static ThreadLocal<String> myKey = new ThreadLocal<>(); 

    private KPContextHolder() { 

    } 

    public static String getMyKey() { 
     return myKey.get(); 
    } 

    public static void setMyKey(final String input) { 
     myKey.set(input); 
    } 

    /** 
    * Clear all the fields saved in the thread context 
    */ 
    public static void clear() { 
     myKey.remove(); 

    } 

} 

攔截器類

public class MyInFaultInterceptor extends AbstractPhaseInterceptor<Message>  { 
      public MyInFaultInterceptor() { 
       super(Phase.RECEIVE); 
      } 

      public void handleMessage(Message message) { 
       KPContextHolder.setMyKey("value"); 
      } 
} 

和WebService方法。

public String addNumbers(int a, int b){ 
    try{ 
      myService.add(a,b); 
    }catch(MyServiceException e){ 
      //Logging 
    } 
    String value = KPContextHolder.getMyKey(); 
} 

注:

  1. 一旦使用,你應該明確地清除線程上下文否則你最終會泄漏內存