2012-10-24 56 views
3

我正試圖找到一種方法來在運行時注入幾個EJB之間進行選擇。如何選擇要在運行時注入的bean

這種情況是這樣的: 有2個bean(ejbA,ejbB),它們都實現了相同的接口(ejbInterface)。在幾個注入點(其他託管bean,即ejbCaller bean)中,我想注入一個ejbInterface的實現。我會知道我在運行時需要哪一個(即基於某個DB值)。

我知道這樣做的一種工作方式是通過@Alternative註釋和部署描述符在部署中進行選擇,但我寧願在運行時進行選擇。

我已經嘗試過@Producer方法,但這種方式我只能注入非託管對象(我在生產者中實例化的對象,並且不是容器管理的或者可以是它們自己的注入點)。我已經發現兩種解決方法/生產的漏洞:

  • 生產的未管理的對象,並且經由在ejbInterface一個setup方法傳遞任何被管理對象(即其他豆類,實體管理器)(ejbCaller將不得不通過這些)
  • 使用JNDI查找在生產者和返回管理對象

兩個解決方法是容易出錯和不優雅。有更好的解決方案嗎?

+1

我肯定會與第二選擇的餘地。在這裏看看類似的情況:http://stackoverflow.com/questions/12512571/jpa-inheritance-and-ejb-polymorphism – perissf

+0

非常感謝你的指針!我同意第一種方法更危險。我將研究JNDI查找並瞭解它的發展情況。 – Cascader

+1

沒有從CDI看過Instance? – LightGuard

回答

1

只需注入BeanManager和使用

javax.enterprise.inject.spi.BeanManager.getBeans(Type, Annotation...) 

在運行時