2016-11-13 43 views
1

我正在寫一個CDI擴展。在CDI擴展中,告訴注入點是否滿足的最簡單方法是什麼?

什麼是最簡單的方法來查找在bean部署期間是否滿足給定的注入點,並在不滿足時將其刪除?

ProcessInjectionPoint時間還爲時過早,因爲bean發現還沒有完成,所以你不能告訴任何給定的InjectionPoint是否存在一個bean來滿足它。

ProcessInjectionTarget-時間似乎也是錯誤的地方,因爲雖然所有的注入點已經被讀取,但現在沒有辦法現在刪除一個。

我需要一個事件,讓我可以從注射目標中移除注射點,如果我可以確定注射點不會得到滿足。

(背景:我擺弄翻譯編程Guice的com.google.inject.Inject註釋(其特點是optional屬性))

回答

0

我不認爲這是可能做到這一點,至少不會這樣。您的問題聽起來與CDI-45 issue中討論的非常相似,因此可能需要在此處描述此用例。

對於你的情況,有一點是我使用@Inject Instance<MyBeanClass>而不是古典注射。這允許您檢測(在運行時)您是否有任何(或多個)滿足IP的bean。我不知道任何關於com.google.inject.Inject和它的optional功能,但CDI Instance似乎非常接近。

編輯:我的一位同事帶來了一個可以幫助你的好主意。您仍將使用擴展程序,並且您將觀察AfterBeanDiscovery階段。現在您需要使用BeanManager來驗證是否存在不滿意的分辨率手動。爲此,您可能會用BM.resolve(BM.getBean())。現在,如果您發現某些可選IP不滿意,您可以致電AfterBeanDiscovery.addBean(myWrapperBean)。其中myWrapperBeanjavax.enterprise.inject.spi.Bean界面的impl(包裝)。這個包裝將是一個'虛擬生產者',基本上返回null

而且應該這樣做,儘管它不適用於定製豆類,例如,豆通過AfterBeanDiscovery添加,但我想這對你很好。

+0

確實如此,但不幸的是我正在使用的代碼(我不控制)使用'com.google.inject.Inject(optional = true)'代替。嗯。基本上我期望在容器驗證時有效截取注入點,如果發現它不好,只需將相關字段/參數設置爲null。我不認爲這需要我沒有的上下文 - 當然CDI的類型安全解析算法具有它需要的所有上下文?我所缺少的是在生命週期中正確點的增變器。我可能需要引入一個生成的生產者方法。 –

+0

哦,我明白了,誤解了你。在這種情況下,我的答案的第一部分沒有太大意義,忽略它。是的,類型解析機制確實會在應用程序初始化時驗證條件,並且確實具有足夠的信息。然而,我仍然知道沒有任何'mutator'機制可以幫助你。您的問題與[CDI-45問題](https://issues.jboss.org/browse/CDI-45)中討論的完全相同 - 在解釋此用例時,值得在其中添加註釋。或者在Weld forums/issue tracker上點擊我們,以便我們可以進一步討論。同時我會在這裏更新答案。 – Siliarus

相關問題