[英]Wildfly 8 and weld CDI inject via provider method does not inject dependecies
我有一個接口及其實現。
interface MyInterface {
public void doSomething();
}
@Alternative
class MyImpl implements MyInterface {
@Inject DB db;
public void doSomething() {
// db.select ....
}
}
由於我希望能夠通過配置文件更改數據庫,因此我使用了提供程序方法來生成實現
@Singleton
public class MyApiProvider {
@Produces
public MyInterface getMyApi() {
return new MyImpl();
}
}
問題是,當通過getMyApi方法生成MyImpl類時,“ @ Inject DB db;” 在MyImpl類中為null。
因此,我要做的就是能夠配置要在運行時使用的實現。
編輯:當我刪除@Alternative並刪除提供程序類/方法時,一切都按預期工作..
編輯2:我想從配置文件中告訴我的webapp我今天要使用MyInterface的哪個實現類。 明天也許我想要另一個實現,而又不想重新編譯整個項目。
之所以發生這種情況,是因為您正在創建MyImpl
類,而不是讓CDI實現來實現。
只有在CDI控制對象生命周期時,您才能進行注入(和其他注釋處理)。
您可能正在尋找的是@Qualifier 。
可以在beans.xml文件中指定特定的@Alternative
。
或者,您可以嘗試以下操作:
@ApplicationScoped
public class Configuration {
public String getMyInterfaceImpl() {
// property file loading logic
}
}
public class SomeClient {
@Inject @Named("#{configuration.myInterfaceImpl}")
private MyInterface myInterface;
...
}
您可以使用基於屬性/參數選擇具體實現的生產者方法:
@Produces
public MyInterface myInterface(MyImplA a, MyImplB b) {
return (propertyValueA) ? a : b;
}
由於生產者方法需要實例a和b,因此它們將由容器創建並因此使用注入。
這是一種快速且簡化的方法,如果您需要更多的變體或實例創建非常昂貴,則應使用CDI BeanManager來獲取並選擇要返回的Bean。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.