cdi注入的依赖关系在生产者方法创建的bean中解析为空

时间:2018-12-17 13:02:31

标签: java-ee cdi

我试图将一个依赖项注入一个用Some/OtherImpl注释的bean(@Named)中,但是该依赖项(configurationService)总是解析为null({{ 1}}不会被调用),当使用其生产者方法在控制器(MyCtrl)中创建该bean的新实例时。

但是,如果我尝试将ConfigurationService直接注入到控制器中,则方法Resources#getConfiguratioService将执行并创建Resources#getConfiguratioService的新实例,并将其注入到控制器中。

这是它的样子

ConfigurationService

您能告诉我我在做什么错吗?有办法解决吗?每个提示将不胜感激。提前谢谢!

1 个答案:

答案 0 :(得分:0)

这里的问题是,您正在使用SomeImpl关键字“手动”创建new的实例。在这种情况下,您创建/提供了对象,没有注入发生,并且您将此对象移交给CDI。从那里开始,任何类型为SomeImpl且使用默认限定符的注入点都将使用您的生产者来创建bean。生产者通常是将非CDI对象转换为CDI bean的一种方法,但有局限性在于不会发生注入。请注意,这种限制有时是实际的优势,因为某些其他框架可能会解决注入或实例化并更改实例,而您只是将其传递给CDI(例如-与EJB集成)。

作为解决方案,删除生产者并让CDI自己创建实例。 CDI将调用no-arg构造函数(如果存在则带有可注入参数的构造函数)来创建实例并然后注入到这个新对象中。

从那里开始,您的代码应该可以按预期工作。

在极少数情况下,您不能让CDI管理整个生命周期,而实际上需要手动创建实例并仍然将其注入其中,InjectionTargetFactory是您要寻找的。它需要一个BeanManager.getInjectionTargetFactory(),您需要的起点。