我试图将一个依赖项注入一个用Some/OtherImpl
注释的bean(@Named
)中,但是该依赖项(configurationService
)总是解析为null
({{ 1}}不会被调用),当使用其生产者方法在控制器(MyCtrl)中创建该bean的新实例时。
但是,如果我尝试将ConfigurationService直接注入到控制器中,则方法Resources#getConfiguratioService
将执行并创建Resources#getConfiguratioService
的新实例,并将其注入到控制器中。
这是它的样子
ConfigurationService
您能告诉我我在做什么错吗?有办法解决吗?每个提示将不胜感激。提前谢谢!
答案 0 :(得分:0)
这里的问题是,您正在使用SomeImpl
关键字“手动”创建new
的实例。在这种情况下,您创建/提供了对象,没有注入发生,并且您将此对象移交给CDI。从那里开始,任何类型为SomeImpl
且使用默认限定符的注入点都将使用您的生产者来创建bean。生产者通常是将非CDI对象转换为CDI bean的一种方法,但有局限性在于不会发生注入。请注意,这种限制有时是实际的优势,因为某些其他框架可能会解决注入或实例化并更改实例,而您只是将其传递给CDI(例如-与EJB集成)。
作为解决方案,删除生产者并让CDI自己创建实例。 CDI将调用no-arg构造函数(如果存在则带有可注入参数的构造函数)来创建实例并然后注入到这个新对象中。
从那里开始,您的代码应该可以按预期工作。
在极少数情况下,您不能让CDI管理整个生命周期,而实际上需要手动创建实例并仍然将其注入其中,InjectionTargetFactory
是您要寻找的。它需要一个BeanManager.getInjectionTargetFactory()
,您需要的起点。