在我们的应用程序中,我们具有如下结构的CDI(@ApplicationScoped批注)和EJB(@Stateless注释)Bean:
MyInterface
MyAbstractClass
MyBean (CDI or EJB)
我正在下面使用它来获取实现MyInterface的应用程序中的所有bean(CDI和EJB):
@Inject
Instance<MyIterface> beans;
我在这里看到两件事:
如何通过上面的注入获得所有的bean,CDI和EJB?
@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;
此外,您将无法将注入的代理转换为任何其他类型。