CDI (Weld SE) 在使用 Producer 方法时不注入内部依赖
CDI (Weld SE) not injecting inner dependencies when using Producer method
我在一个独立的 java 项目上使用 WELD SE,在我开始使用生产者之前它似乎工作正常。
生产者方法有效 - 容器使用它,但从不注入生成的 bean 的内部依赖项。当我删除生产者时,它正常工作。即使在规范和 Google.
上进行了长时间搜索后,我也找不到原因
生产者示例:
@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 with bean-discovery-mode="all".
有什么线索吗?
这不仅仅是SE的问题,实际上是CDI的desired/expected行为。
这背后的原因是,通常情况下,如果您没有生产者,CDI 会为您创建 bean classes(通过调用无参数构造函数,或带有注入的构造函数),然后解析注入bean 中的点(并做一些其他事情,请参阅规范)。 例如您将生命周期管理留给 CDI 容器。
另一方面,使用生产者通常是一种从 class 中创建 bean 的方法,其中:
- 您无法自己控制生命周期,例如实体管理器
- 您与其他框架集成并且它们具有复杂的初始化
- 在调用某些构造函数之前,您需要对外部配置进行一些检查
- 或者您可能想要原始类型 (int) 的 bean
- 以及更多用例
现在这意味着 您负责创建 bean。这包括其中的任何字段。 Container 只是将生产者作为创建成熟 bean 的一种方式,并假设您已经注意或需要什么初始化。
现在,根据你的问题我判断你需要里面的注入点解析。由于 CDI 的静态特性(以及其他更复杂的原因),没有简单的方法(如果有的话)手动 "enforce" 分辨率。因此,我建议使用不同的方法并利用构造函数注入或初始化方法?如果您提供更多信息,我可能会提供帮助。
我在一个独立的 java 项目上使用 WELD SE,在我开始使用生产者之前它似乎工作正常。
生产者方法有效 - 容器使用它,但从不注入生成的 bean 的内部依赖项。当我删除生产者时,它正常工作。即使在规范和 Google.
上进行了长时间搜索后,我也找不到原因生产者示例:
@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 with bean-discovery-mode="all".
有什么线索吗?
这不仅仅是SE的问题,实际上是CDI的desired/expected行为。
这背后的原因是,通常情况下,如果您没有生产者,CDI 会为您创建 bean classes(通过调用无参数构造函数,或带有注入的构造函数),然后解析注入bean 中的点(并做一些其他事情,请参阅规范)。 例如您将生命周期管理留给 CDI 容器。
另一方面,使用生产者通常是一种从 class 中创建 bean 的方法,其中:
- 您无法自己控制生命周期,例如实体管理器
- 您与其他框架集成并且它们具有复杂的初始化
- 在调用某些构造函数之前,您需要对外部配置进行一些检查
- 或者您可能想要原始类型 (int) 的 bean
- 以及更多用例
现在这意味着 您负责创建 bean。这包括其中的任何字段。 Container 只是将生产者作为创建成熟 bean 的一种方式,并假设您已经注意或需要什么初始化。
现在,根据你的问题我判断你需要里面的注入点解析。由于 CDI 的静态特性(以及其他更复杂的原因),没有简单的方法(如果有的话)手动 "enforce" 分辨率。因此,我建议使用不同的方法并利用构造函数注入或初始化方法?如果您提供更多信息,我可能会提供帮助。