【问题标题】:Instantiate CDI beans dynamically or inject in non-cdi-beans动态实例化 CDI bean 或注入非 cdi-bean
【发布时间】:2023-03-10 22:54:01
【问题描述】:

我是 CDI 的新手,希望有人可以帮助我。

好吧,让我解释一下问题:
我实现了一个由 JSF EL 调用的主 bean。此 bean 处理对象列表。想象一下像List<Car> 这样的东西。 这些汽车对象是在主 bean 的 @PostMethod 方法中构造的。
此外,我还有一些服务类,例如CarServices 提供类似public static List<Car> getCarsOfBrand(Session session, Brand brand) 的内容。 在服务类中,Hibernate 会话用于运行查询并返回应得的列表。
所以,好吧......我想摆脱传递会话对象。所以我的计划是注入它。 我使用public Session getCurrentSession() 方法创建了一个 SessionScoped bean“PersistenceUnit”(可能是该名称已预先分配,对此感到抱歉……)。 我只是想在我的所有服务类中注入这个 bean 来调用类似getCarsOfBrand(Brand brand) 的东西。 问题是,我无法将 CDI bean 注入非 bean。 (汽车目前只是一个 POJO)。 我也尝试通过添加@SessionScoped 将汽车声明为CDI bean 来处理这个问题。 但下一个问题是,Car 对象是由我实例化的,而不是由 Container 实例化的。 我尝试了类似的东西

@Produces
public Car createCar() {
     return new Car();
}

但这也不成功:我认为这个带注释的方法返回汽车的代理。但是什么也没发生。 car 内部的注入字段仍然为 null,并且它的 @PostConstruct 方法也从未被调用过。

那你能帮帮我吗?将当前上下文(会话)注入我的服务类的正确方法是什么?

谢谢! :-)

【问题讨论】:

    标签: jakarta-ee dependency-injection cdi weld


    【解决方案1】:

    所以,我自己找到了解决方案! :-)

    我将服务类注释为@ApplicationScoped 并注入我需要的任何东西。 Car-Class 使用该服务,但本身不是 bean。 为此,我在实例化对象时使用 DeltaSpike 进行注入:

    public Car() {
      BeanProvider.injectFields(this);
    }
    

    希望我将来可以帮助某人! :-)

    【讨论】:

    • 您在构造函数中泄漏了“this”引用。别。许多微妙的可怕事情可能会发生。并且将 CDI bean 实例作为非 CDI 托管 bean 的属性会引起麻烦,首先会想到内存泄漏。话虽如此,这里可能存在根本的设计缺陷。另一方面,如果 Car 应该是 CDI bean,则只需使用构造函数注入。
    猜你喜欢
    • 2016-08-05
    • 2013-03-05
    • 1970-01-01
    • 2013-11-26
    • 2014-06-02
    • 2015-04-15
    • 2015-02-12
    • 2016-06-08
    • 2015-04-20
    相关资源
    最近更新 更多