将CDI装饰器添加到消息驱动的Bean

问题描述 投票:1回答:1

鉴于以下消息驱动的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文件。

java decorator cdi message-driven-bean
1个回答
1
投票

简短的答案(但不要失去希望)是不,因为@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或更高版本中,这才有效)。>>

© www.soinside.com 2019 - 2024. All rights reserved.