当前位置: 首页 > 知识库问答 >
问题:

向消息驱动Bean添加CDI装饰器

融烨华
2023-03-14

给定下面的消息驱动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文件添加到我的模块中。

共有1个答案

平和雅
2023-03-14

简短的答案(但不要失去希望)是否定的,因为@messagedrivenbean不是CDI托管bean,只有CDI托管bean才能是装饰器。

现在,您可以做的(我自己没有这样做的经验)是这样的:

  • 使用@javax.annotation.resource调用MessageListener由Java EE(而不是CDI)注入字段(因此将在JNDI中查找)
  • 通过使用该字段的内容和createInterceptionFactory方法的组合,编写一个@productionMessageListener实例的生成器方法
  • @injectMessageListener在您想要使用的任何地方生成的MessageListener

InterceptionFactory实际上是将拦截(而decorator只是一种非常特殊的拦截)动态添加到非CDI托管bean的东西中的唯一机制。

最后,只有使用CDI2.0(Java EE8或更高版本)时,这才起作用。

 类似资料:
  • 是否可以在MDB(消息驱动Bean)中为“目的地”动态分配运行时值? 我还尝试了ejb-jar.xml方法,但是“activation-config-property-name”=“destination”的值被理解为队列的文字物理名称。因此我无法对资源进行JNDI查找。 从属性读取和分配目标或使用-d参数传递值的正确方法是什么?

  • 在企业应用程序中,我试图使用netBeans 8.1将MessageDriven beans注入Web应用程序(到REST服务)。我在IDE中没有得到任何警告,但是,在部署时,我得到以下错误: 严重:加载应用程序时出现异常:CDI部署失败:Weld-001408:未满足类型StatisticsBean的依赖关系,其限定符@Default在注入点[BackedAnnotatedField]@Inje

  • 消息驱动Bean是一种企业bean,当EJB容器从队列或主题接收消息时由EJB容器调用。 消息驱动的bean是一个无状态bean,用于异步执行任务。 为了演示消息驱动bean的使用,我们将使用EJB-persistence章节,我们需要执行以下任务 - Step 1 - 在数据库中创建表(请参阅EJB-Persistence章节)。 Step 2 - 创建与表对应的实体类(请参阅EJB-Persi

  • 早上好在我的时区。 事先表示感谢并致以最良好的问候

  • 同事, 你能帮我解决以下问题吗? 我有JavaEE应用程序。它包含一些具有业务逻辑的消息驱动Bean和一些负责整个应用程序配置的不同方面的管理Bean。我想设置bean启动和初始化的顺序。这意味着在管理Bean完成应用程序的初始化之前,容器不应该调用消息驱动Bean。应用程序的初始化包括读取和解析一些配置文件,这需要一些时间。 有WebSphere配置选项吗? 或者它应该只以编程方式完成技巧?

  • 在一个无状态bean中,我正在查找队列,这是正确的,并且发送没有抛出异常: 但不调用消息驱动bean的onMessage方法。 我错过了什么? 我的消息驱动bean有以下代码: