【发布时间】:2012-06-04 21:17:08
【问题描述】:
在自定义 cxf 拦截器中使用 @Autowired 时,我似乎遇到了一个小问题。 我的用例是我想记录肥皂消息并使用 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());
}
}
【问题讨论】:
-
通过“拾取”你的意思是你的 LogInInterceptor 被找到并且有资格从 Spring 容器注入?它是否报告了注入的任何其他问题(例如 @Value 参数失败)?
-
你能把这个拦截器的配置也分享给CXF吗?出现此问题的原因可能是拦截器可能已被 CXF 实例化,并且可能已由 Spring 创建单独的自动装配实例。
-
我已经实现了上面的拦截器,并通过@org.apache.cxf.interceptor.InInterceptors (interceptors = {"org.apache.cxf.interceptor.LoggingInInterceptor"," mypackagenames.ws.interceptor.LogInInterceptor"}) 我根本没有执行任何额外的配置。
-
马尔科,这就是原因。 CXF 正在创建对象并使用该对象,而不是 Spring。
标签: web-services spring dependency-injection cxf