java - 如何告诉 CDI 容器 "activate"一个 bean?

标签 java jakarta-ee ejb wildfly cdi

假设我有一些关于注入(inject)的类(class):

class MyBean {

    @Inject
    Helper helper;

    // all sorts of data
}

并且此类的创建方式是 CDI 容器不知道的,例如反射、序列化或 new 。在这种情况下 helpernull因为CDI没有为我们初始化它。

有没有办法告诉 CDI“激活”bean 或至少它的注入(inject)?例如,就好像它是用 Instance<MyBean>#get 创建的?

现在我有一个 hack,可以执行以下操作:

class SomeClass {

    @Inject
    Instance<MyBean> beanCreator;

    void activateBean() {
        MyBean mybean = ... // reflection/serialization/new
        MyBean realBean = beanCreator.get();
        Helper proxy = realBean.getHelper();
        mybean.setHelper(proxy);
        beanCreator.destroy(realBean);
    }
}

这看起来很糟糕,但它适用于我测试的所有内容。它只是显示了我想要的最终结果。

如果有必要,请使用 Wildfly 10.1。

最佳答案

首先,您使用MyBean的方式不是CDI方式;事实上,您对所谓的非上下文对象进行操作。您正在做的是获取非 CDI 托管对象并要求 CDI 解析注入(inject)点。这是很不寻常的,因为您处理生命周期的一部分(创建/销毁),同时要求 CDI 完成其余的工作。

在您的情况下,MyBean 类需要变为 InjectionTarget ,这就是您应该开始寻找的方式。为了触发注入(inject),您需要执行以下操作(在创建 MyBean 期间):

// Create an injection target from your given class
InjectionTarget<MyBean> it = beanManager.getInjectionTargetFactory(beanManager.createAnnotatedType(MyBean.class))
                .createInjectionTarget(null);
CreationalContext<MyBean> ctx = beanManager.createCreationalContext(null);
MyBean instance = new MyBean();
it.postConstruct(instance); // invoke @PostContruct
it.inject(instance, ctx); // trigger actual injection on the instance

请注意,这种方法通常很笨拙(因为很难使其工作和维护),最好将您的 MyBean 转变为真正的 CDI bean,并将整个生命周期管理留给CDI。然而,为此,您的问题没有提供足够的信息。

关于java - 如何告诉 CDI 容器 "activate"一个 bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46026384/

相关文章:

自动化任务的 Java EE 身份验证/授权

java - 如何在 MSSQL 中将特定行的 ResultSet move 到它的末尾?

java Long数据类型比较

java - 将 JPQL 自定义查询结果渲染到 JSF 页面中的问题

java - 通过 http post 下载文件将返回 zip 文件内容

android - 带有桌面、android 和 ios 客户端的 java-ee 应用程序

java - PreUpdate 回调中未修改字段值

Java - 我从 equals 方法得到错误的输出

java - 如何在 Vaadin 中实现延迟加载树?

java - 注册为 ServletContextListener 的类的生命周期是什么