簡體   English   中英

將CDI注入到現有對象實例中-與CDI 1.0一起使用,但不適用於CDI 1.1

[英]CDI Injection into existing object instance - worked with CDI 1.0 but not with CDI 1.1

由於我必須使用的框架的限制,我需要注入現有的對象實例(無法通過CDI本身照常創建它們)。 我的注入點用@EJB@Inject標記。

在JBoss EAP 6.4,Java EE 6和CDI 1.0中,使用以下代碼可以很好地工作:

public class DispatcherUtils {

    public static <T> void inject(T anObject) {
        BeanManager beanManager = getBeanManager();
        Class<T> objClass = (Class<T>) anObject.getClass();
        AnnotatedType<T> annotatedType = beanManager.createAnnotatedType(objClass);
        InjectionTarget<T> injectionTarget = beanManager.createInjectionTarget(annotatedType);
        CreationalContext<T> context = new IgnorantCreationalContext<>();
        injectionTarget.inject(anObject, context);
        injectionTarget.postConstruct(anObject);
    }

    private static BeanManager getBeanManager() {
        try {
            return (BeanManager) InitialContext.doLookup("java:comp/BeanManager");
        } catch (final NamingException e) {
            e.printStackTrace();
        }
        return null;
    }

}

如果我嘗試在JBoss EAP 7.0,Java EE 7和CDI 1.1中執行相同的操作,則僅將標有@Inject的注入點注入到目標對象中,而標有@EJB的注入點不會注入(它們的值保持為null)。

我不明白為什么會這樣。

是否可以通過JBoss EAP 7.0,Java EE 7和CDI 1.1注入現有對象,並填充@EJB注入點?


更新,2016-06-19,20:11

我剛剛發現,只要要注入的對象具有無參數構造函數,上述模式就可以工作。

示例-這可以工作

public class ExampleBean {

    private Dispatcher dispatcher;

    @Inject
    private SomeCdiBean someCdiBean;

    @EJB
    private SomeEjbService someEjbService;

    public ExampleBean() {
    }

    public ExampleBean(Dispatcher dispatcher) {
        this.dispatcher = dispatcher;
    }

}

雖然這不起作用

public class ExampleBean {

    private Dispatcher dispatcher;

    @Inject
    private SomeCdiBean someCdiBean;

    @EJB
    private SomeEjbService someEjbService;

    public ExampleBean(Dispatcher dispatcher) {
        this.dispatcher = dispatcher;
    }

}

在這種情況下,為什么CDI會檢查默認構造函數的存在? (注意:bean 不是由CDI創建的,因此構造函數不應有任何區別)

可能的問題可能是, 沒有 no-args構造函數的ExampleBean 被視為托管bean 集成商(Wildfly,EAP,glassfish等)只能向managed beans提供EE資源注入( @EJB是EE資源注入)。

引用Weld文檔

集成商可能希望使用InjectionServices提供Weld提供的其他字段或方法注入。 與Java EE環境的集成可以使用InjectionServices為托管bean提供EE資源注入。

為了使ExampleBean成為managed bean並且不使用no-args構造函數,您需要聲明一個@Inject注釋的構造函數。

盡管我在這里只是一個瘋狂的猜測,但不能真正確定為什么您說它可以與EAP 6和CDI 1.0一起使用。

僅作記錄用途-據我所知,EAP 7包含CDI 1.2 (而不是1.1)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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