cxf拦截器,监听器和web服务之间的通信(jaxws)

时间:2016-07-08 08:21:51

标签: java web-services cxf jax-ws interceptor

我们有调用另一个Web服务的web服务(jaxws)(aslo jaxws)。 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服务代码中,对于给定的&#34; key&#34;,我们将为null,表示&#34; key&#34;不在场。

  

我们有什么办法可以在拦截器之间进行通信   网络服务?

     

P.S :我们可以使用上述方法在拦截器和听众中进行通信。也就是说,我们可以访问密钥集   inFaultInterceptor中的outInterceptor,但在任何拦截器中设置了键   或者在Web服务中无法访问监听器。

1 个答案:

答案 0 :(得分:1)

不确定构建机制中是否有任何Cxf,我使用ThreadLocal在webservice方法和拦截器之间传递信息,

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. 一旦使用,你应该明确地清除线程上下文,否则你最终会泄漏内存