鉴于以下消息驱动的Bean,是否可以根据CDI规范定义全局装饰器以添加其他行为?
@MessageDriven
public class MyMessageDrivenBean implements MessageListener {
@Override
public void onMessage(Message m) {
}
}
装饰器看起来像这样:
@Decorator
@Priority(Interceptor.Priority.APPLICATION)
public abstract DecorateMyMessageDrivenBean implements MessageListener {
@Inject
@Delegate
@Any
private MessageListener delegate;
@Override
public void onMessage(Message m) {
}
}
当前,装饰器没有被执行。我已经在模块中添加了一个beans.xml文件。
简短的答案(但不要失去希望)是不,因为@MessageDrivenBean
不是CDI管理的bean,而only CDI managed beans can be decorators。
现在,您可能能够做的(而且我自己没有这样做的经验)是这样的:
@javax.annotation.Resource
要求通过Java EE而不是CDI将@javax.annotation.Resource
注入到字段中(因此它将在JNDI中查找)MessageListener
方法的组合编写一个@Produces
MessageListener
实例的生产者方法createInterceptionFactory
如此产生的createInterceptionFactory
,无论您想在哪里使用它]@Inject
实际上是向非CDI托管Bean事物动态添加拦截(装饰器只是拦截的一种非常特殊的情况)的唯一机制。
最后,只有在使用CDI 2.0(在Java EE 8或更高版本中,这才有效)。>>