【问题标题】:Using @Inject Instance to get EJB and CDI beans that implements specific interface使用@Inject Instance 获取实现特定接口的 EJB 和 CDI bean
【发布时间】:2020-02-05 05:25:20
【问题描述】:

在我们的应用程序中,我们有 CDI(@ApplicationScoped 注释)和 EJB(@Stateless 注释)bean,其结构如下:

MyInterface
    MyAbstractClass
       MyBean (CDI or EJB)

我正在使用下面来获取我的应用程序中实现 MyInterface 的所有 bean(CDI 和 EJB):

@Inject
Instance<MyIterface> beans;

在这里我看到了两个奇怪的东西:

  • 我只得到 CDI bean 而不是 EJB bean。
  • 在创建直接实现 MyInterface 接口而不扩展 MyAbstractClass 的 EJB bean 时,在这种情况下,这个 bean 会被上面的注入注入。

如何通过上面的注入获取所有 bean、CDI 和 EJB?

【问题讨论】:

    标签: java ejb cdi


    【解决方案1】:

    引自 EJB 3.2 规范第 4.9.2.1 节:

    @Stateless
    public class A implements Foo { ... }
    
    @Stateless
    public class B extends A implements Bar { ... }
    

    假设 Foo 和 Bar 是本地业务接口并且没有关联的部署描述符,会话 bean A 公开本地业务接口 Foo,会话 bean B 公开本地业务接口 Bar,但不公开 Foo。

    会话 bean B 需要在其公开视图集中显式包含 Foo,以便该接口 申请。例如:

    @Stateless
    public class A implements Foo { ... }
    
    @Stateless
    public class B extends A implements Foo, Bar { ... }
    

    在您的示例中,定义为 EJB 的 MyBean 不会公开 MyInterface,因此不会在 Instance&lt;MyInterface&gt; 处注入。

    有两种处理方式:

    • 将 EJB 声明为实现 MyInterface
    • @Local(MyInterface.class)注释EJB

    @Local 方法的警告 - 此 EJB 将仅满足那些使用作为注释参数提供的接口之一的注入点。您将无法在以下位置注入它

    @Inject
    MyBean bean;
    

    此外,您将无法将注入的代理转换为任何其他类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-11
      • 2015-02-12
      • 2015-09-08
      • 2011-05-07
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多