我正在尝试找到一种在运行时注入的几个 EJB 之间进行选择的方法。
场景是这样的:有 2 个 bean (ejbA, ejbB),它们都实现了相同的接口 (ejbInterface)。在几个注入点(其他托管 bean,即在 ejbCaller bean 中)我想注入 ejbInterface 的实现。我会在运行时知道我需要哪一个(即基于一些 DB 值)。
我知道一种可行的方法是通过@Alternative 注释和部署描述符在部署时进行选择,但我宁愿在运行时进行选择。
我已经尝试过@Producer 方法,但这样我只能注入非托管对象(我在生产者中实例化并且不是容器管理的对象,或者它们本身可以是注入点)。我发现了生产者的两种解决方法/利用:
- 生成一个非托管对象并通过
setup
ejbInterface 中的方法传递任何托管对象(即其他 bean、实体管理器)(ejbCaller 必须传递这些) - 在生产者中使用 JNDI 查找并返回托管对象
这两种解决方法都容易出错且不优雅。有没有更好的解决方案?