【问题标题】:CDI (Weld SE) not injecting inner dependencies when using Producer method使用 Producer 方法时 CDI (Weld SE) 不注入内部依赖项
【发布时间】:2016-10-24 18:49:10
【问题描述】:

我在一个独立的 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,其中 bean-discovery-mode="all"。

关于发生了什么的任何线索?

【问题讨论】:

    标签: java dependency-injection cdi weld


    【解决方案1】:

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

    这背后的原因是,通常,如果您没有生产者,CDI 会为您创建 bean 类(通过调用无参数构造函数,或带有注入的构造函数)并随后解析 bean 中的注入点(并且确实其他一些东西,请参阅规范)。 例如您将生命周期管理留给 CDI 容器。

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

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

    现在这意味着您负责创建 bean。这包括其中的任何字段。 Container 只是将生产者作为创建成熟 bean 的一种方式,并假设您已注意或初始化所需的内容。

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

    【讨论】:

    • 对我感到羞耻 - 我不知道的基本内容。谢谢你。我从来不需要创建一个带有@Inject 标记的内部依赖关系的bean 的生产者,所以它总是有效的——在我看来,一旦你将参数传递给构造函数,CDI 将继续注入用Inject 显式标记的属性。这将很难实现,所以我认为框架的行为是正确的。
    • 我可以通过将这个地图(见我的帖子)包装在另一个类(没有额外的依赖项)中来解决这个问题。所以,我制作了这个类的生产者(工作正常),然后通过构造函数在 LaminaValidador 中 @inject 它。现在就像一个魅力。再次感谢。
    • 很高兴我能帮上忙!顺便说一句,用另一个类包装确实有效,但您也可以创建一个生产者方法,该方法将为您生成地图(并且在方法的主体中,您可以根据需要对其进行初始化)。这样的生产者方法可以驻留在您现在拥有的同一个类中。然后你可以在任何地方注入地图,包括LaminaValidador类的构造函数(例如using constructor injection)。
    猜你喜欢
    • 2021-12-08
    • 2020-08-02
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 2011-09-19
    • 2018-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多