CDI(Weld SE)在使用Producer方法时不注入内部依赖项

时间:2016-10-24 18:49:10

标签: java dependency-injection cdi weld

我在一个独立的java项目中使用WELD SE,在我开始使用生产者之前似乎工作正常。

生成器方法有效 - 容器使用它,但从不注入生成的bean的内部pdependencies。当我删除生产者时,它正常工作。即使经过长时间搜索规范和谷歌,我也找不到原因。

制作人的例子:

@ApplicationScoped
public class LaminaValidadorProducer {

    private static final String XSD_PATH = getConfig("processador.xsd.path");
    private static final Map<VersaoLamina,String> XSD_PER_VERSION = new HashMap<>();
    static {
        XSD_PER_VERSION.put(VersaoLamina.V1, getConfig("processador.lamina.xsd.file"));
        XSD_PER_VERSION.put(VersaoLamina.V2, getConfig("processador.laminav2.xsd.file"));        
    }

    @Produces
    public LaminaValidador buildValidador() {
        return new LaminaValidador(XSD_PATH, XSD_PER_VERSION);
    }
}

LaminaValidador正常注入,但其INNER属性(标有@Inject)未被注入。该项目有一个beans.xml,其中bean-discovery-mode =“all”。

有关正在发生的事情的任何线索?

1 个答案:

答案 0 :(得分:1)

这不仅仅是SE的问题,实际上是CDI的期望/预期行为。

这背后的原因是,通常,如果你没有生产者,CDI会为你创建bean类(通过调用no-args构造函数,或者使用注入),然后解析bean中的注入点(并且其他一些事情,见规格)。的 E.g。您将生命周期管理留给CDI容器。

另一方面,使用生产者通常是一种从类中创建bean的方法:

  • 你无法控制自己的生命周期,例如的EntityManager
  • 你与其他框架集成并且他们有复杂的初始化
  • 在调用某些构造函数
  • 之前,您需要对外部配置进行一些检查
  • 或者你可能想要一个原始类型的bean(int)
  • 以及更多用例

现在这意味着你负责创建bean 。这包括其中的任何领域。容器只是将生产者作为创建一个完整的bean的一种方式,并假设你注意或初始化需要什么。

现在,根据你的问题,我判断你需要内部的注射点分辨率。由于CDI的静态特性(以及其他更复杂的原因),没有简单的方法(如果有的话)手动“强制执行”解决方案。因此我建议使用不同的方法并利用构造函数注入或初始化方法?如果您提供更多信息,我可能会提供帮助。