簡體   English   中英

Wildfly 8和通過提供者方法進行的焊縫CDI注入不會注入依賴項

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM