使用@Inject实例获取实现特定接口的EJB和CDI bean

问题描述 投票:0回答:1

在我们的应用程序中,我们具有如下结构的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个回答
2
投票

@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<MyInterface>处注入。
有两种处理方法:

将EJB声明为实现MyInterface

    @Local(MyInterface.class)注释EJB
  • 警告使用@Local的方法-此EJB将仅满足那些使用作为注释参数提供的接口之一的注入点。您将无法在以下位置注入它]
  • @Inject MyBean bean;

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

  • © www.soinside.com 2019 - 2024. All rights reserved.