在将@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());
}
}
答案 0 :(得分:7)
你不能混合@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>
答案 1 :(得分:1)
我知道这是一个老问题,但Jonathan W的回答帮助了我,我想补充一下。
这就是我使用Spring Boot 1.3.1获取自定义拦截器和s := []int{1, 2}
f = s
s[0] = 11
fmt.Println("Original slice: ", s)
fmt.Println("Slice in interface:", f)
的方法:
http://cxf.apache.org/docs/jax-ws-configuration.html
Original slice: [11 2]
Slice in interface: [11 2]