web-services – 如何在自定义cxf拦截器中使用Spring Autowired?

当使用@Autowired进入自定义cxf拦截器时,我似乎遇到了一个小问题.
我的用例是我想记录soap消息并使用AMQP将它们发送到另一个系统.此过程适用于普通服务等.
但无论我做什么,所需的属性都不会自动装配并保持为空.

我检查了Spring DI日志,扫描并拾取了上下文,所以我缺少什么?

这在CXF拦截器中甚至可能吗?

@Component
public class LogInInterceptor extends AbstractSoapInterceptor {

    private @Value("#{rabbitMQProperties['rabbitmq.binding.log.soap']}")
    String binding;

    @Autowired
    AmqpTemplate amqpTemplate;

    public LogInInterceptor() {
        super(Phase.RECEIVE);
    }

    @Override
    public void handleMessage(SoapMessage soapMessage) throws Fault {
        logIt(soapMessage);
    }

    private void logIt(SoapMessage message) throws Fault {
        // rest of the code omitted...!!!     
        amqpTemplate.convertAndSend(binding,buffer.toString());
    }

}

解决方法

你不能混合使用@InInterceptors(一个CXF注释)和@Component(一个Spring注释).这将创建两个独立的拦截器实例:一个依赖于Spring注入的实例,一个由CXF创建的实例. (您在@InInterceptors注释中提供类名,而不是bean ID,因此CXF无法知道您已在Spring上下文中创建了实例.)

删除@InInterceptors注释,除了component scan之外:

<context:component-scan base-package="org.example.config"/>

您还需要在应用程序上下文中使用以下内容

<jaxws:endpoint id="myWebService" address="/MyWebService">
    <jaxws:inInterceptors>
        <ref bean="myInInterceptor" />
    </jaxws:inInterceptors>
</jaxws:endpoint>

相关文章

vue阻止冒泡事件 阻止点击事件的执行 &lt;div @click=&a...
尝试过使用网友说的API接口获取 找到的都是失效了 暂时就使用...
后台我拿的数据是这样的格式: [ {id:1 , parentId: 0, name:...
JAVA下载文件防重复点击,防止多次下载请求,Cookie方式快速简...
Mip是什么意思以及作用有哪些