我在一个独立的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”。
有关正在发生的事情的任何线索?
答案 0 :(得分:1)
这不仅仅是SE的问题,实际上是CDI的期望/预期行为。
这背后的原因是,通常,如果你没有生产者,CDI会为你创建bean类(通过调用no-args构造函数,或者使用注入),然后解析bean中的注入点(并且其他一些事情,见规格)。的 E.g。您将生命周期管理留给CDI容器。
另一方面,使用生产者通常是一种从类中创建bean的方法:
现在这意味着你负责创建bean 。这包括其中的任何领域。容器只是将生产者作为创建一个完整的bean的一种方式,并假设你注意或初始化需要什么。
现在,根据你的问题,我判断你需要内部的注射点分辨率。由于CDI的静态特性(以及其他更复杂的原因),没有简单的方法(如果有的话)手动“强制执行”解决方案。因此我建议使用不同的方法并利用构造函数注入或初始化方法?如果您提供更多信息,我可能会提供帮助。