当前位置: 首页 > 知识库问答 >
问题:

cxf侦听器、侦听器和webservice(jaxws)之间的通信

丁星火
2023-03-14

我们有web服务(jaxws),它正在调用另一个web服务(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线程中所述,我们使用cxf交换对象在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");
}  

但是,在我们为给定的“key”获取null的Web服务代码中,表示“key”不存在。

我们有什么方法可以在拦截器和web服务之间进行通信吗?

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

共有1个答案

许法
2023-03-14

不确定是否有任何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. 一旦使用,您应该显式清除线程上下文,否则将导致内存泄漏
 类似资料:
  • 问题内容: 我当时在上网,但找不到很好的信息。我试图在每次运行应用程序时检测按键。我正在使用JavaFX并将其与FXML一起运行。我尝试了很多事情,但没有任何效果。请帮我。 问题答案: 您应该签出Ensemble示例。这是关键的侦听器代码。

  • 我正在使用Realex Payments的HPP API开发一个卡支付页面,其中包含一个iFrame,用于托管Realex页面。在Realex请求表单上,我将字段HPP_POST_维度和HPP_POST_响应设置为我的URL,如下所示: 付款页: www.example.com/account/payment.html 隐藏字段值用于在HPP页面大小更改和事务完成时,使用事件侦听器将数据从Real

  • 虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过watch选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。例如: <div id="watch-example"> <p> Ask a yes/no question: <input v-model="question">

  • 1. 前言 本节介绍侦听器 watch 的使用方法。包括什么是侦听器,侦听器的特点,以及如何对不同类型的数据进行监听。其中重点掌握对不同类型的数据如何使用侦听器,了解它之后,在才能在之后的日常开发中熟练运用。 2. 慕课解释 Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性。 — 官方定义 侦听器 watch 是 Vue 提供的一种用来观察和响应 Vue 实例上的数据

  • 问题说明:

  • 我在我的一个工作流应用程序中使用了Camunda BPMN2.0。在我的一个服务任务中,我在start事件中创建了一个执行侦听器,在create事件中创建了一个任务侦听器。我不确定在开始时同时分配这些是否合适。如果是正确的,它们中的哪一个将首先执行--执行监听器或任务监听器,分别在start或create事件中执行?