【发布时间】:2012-10-14 05:07:05
【问题描述】:
我正在尝试找到一种方法来在运行时注入的多个 EJB 之间进行选择。
场景是这样的: 即有 2 个 bean (ejbA, ejbB),它们都实现了相同的接口 (ejbInterface)。在几个注入点(其他托管 bean,即在 ejbCaller bean 中)我想注入 ejbInterface 的实现。我会在运行时知道我需要哪一个(即基于一些 DB 值)。
我知道一种可行的方法是在部署时通过 @Alternative 注释和部署描述符进行选择,但我宁愿在运行时进行选择。
我已经尝试过@Producer 方法,但这样我只能注入非托管对象(我在生产者中实例化并且不是容器管理的对象,或者它们本身可以是注入点)。我发现了生产者的两种解决方法/利用:
- 生成一个非托管对象并通过 ejbInterface 中的
setup方法传递任何托管对象(即其他 bean、实体管理器)(ejbCaller 必须传递这些) - 在生产者中使用 JNDI 查找并返回托管对象
这两种解决方法都容易出错且不优雅。有没有更好的解决方案?
【问题讨论】:
-
我肯定会选择第二个选择。在这里看看类似的情况:stackoverflow.com/questions/12512571/…
-
非常感谢您的指点!我同意第一种方法更危险。我将处理 JNDI 查找,看看进展如何。
-
还没看过 CDI 的实例?
-
这对我来说绝对看起来更优雅。恐怕我从未听说过 CDI 的这个功能(我感到羞耻),但我会探索它。我想如果我
@Inject @Any Instance<ejbInterface> myEJBs并检查 myEJB 中的每个元素,我可以选择从我的生产者那里返回的 EJB。
标签: jakarta-ee ejb cdi