Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee 如何在运行时选择要注入的bean_Jakarta Ee_Ejb_Cdi - Fatal编程技术网

Jakarta ee 如何在运行时选择要注入的bean

Jakarta ee 如何在运行时选择要注入的bean,jakarta-ee,ejb,cdi,Jakarta Ee,Ejb,Cdi,我正试图找到一种方法,在运行时要注入的几个EJB之间进行选择 场景如下所示: 例如,有两个bean(ejbA、ejbB)都实现了相同的接口(ejbInterface)。在几个注入点(其他托管bean,即在ejbCallerbean中),我想注入ejbInterface的实现。我将知道在运行时需要哪一个(即基于某个DB值) 我知道一种可行的方法是通过@Alternative注释和部署描述符在部署时进行选择,但我更愿意在运行时进行选择 我已经尝试了@Producer方法,但这样我只能注入非托管对象(

我正试图找到一种方法,在运行时要注入的几个EJB之间进行选择

场景如下所示: 例如,有两个bean(ejbA、ejbB)都实现了相同的接口(ejbInterface)。在几个注入点(其他托管bean,即在ejbCallerbean中),我想注入ejbInterface的实现。我将知道在运行时需要哪一个(即基于某个DB值)

我知道一种可行的方法是通过@Alternative注释和部署描述符在部署时进行选择,但我更愿意在运行时进行选择

我已经尝试了@Producer方法,但这样我只能注入非托管对象(我在Producer中实例化的对象,它们不是容器管理的,或者它们本身可以是注入点)。我发现了制作人的两个解决方法/漏洞:

  • 生成一个非托管对象,并通过ejbInterface中的
    setup
    方法传递任何托管对象(即其他bean、实体管理器)(ejbCaller必须传递这些)
  • 在生产者中使用JNDI查找并返回托管对象

这两种解决方法都容易出错,而且不美观。有更好的解决方案吗?

只需注入BeanManager并使用

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

在运行时

我肯定会选择第二种选择。看看这里类似的情况:非常感谢你的指点!我同意第一种方法更危险。我将进行JNDI查找,看看它进行得如何。还没有看过CDI中的实例吗?这对我来说肯定更优雅。恐怕我从来没有听说过CDI的这个特性(真丢脸),但我会探索一下。我假设如果我
@Inject@Any Instance myEJBs
并检查myEJBs中的每个元素,我可以选择从生产者返回的EJB。