当前位置: 首页 > 知识库问答 >
问题:

使用@InjectInstance获取实现特定接口的EJB和CDIBean

南门飞
2023-03-14

在我们的应用程序中,我们有CDI(@Application ationScoped注释)和EJB(@无状态注释)bean,其结构如下:

MyInterface
    MyAbstractClass
       MyBean (CDI or EJB)

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

@Inject
Instance<MyIterface> beans;

在这里,我看到了两件奇怪的事情:

  • 我只得到CDI豆,没有EJB豆。
  • 当创建直接实现MyInterface接口的EJB bean时,不扩展MyAbstractClass,比在这种情况下由上面的注入注入这个bean。

如何使用上面的注入获得所有bean、CDI和EJB?

共有1个答案

葛言
2023-03-14

引用第4.9节。EJB 3.2规范的第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,因此不会在实例中注入

有两种处理方法:

  • 声明EJB实现了MyInterface
  • @Local(MyInterface.class)

警告使用@Local的方法-此EJB将仅满足使用作为注释参数提供的接口之一的注入点。你不能在任何时候注射它

@Inject
MyBean bean;

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

 类似资料:
  • 问题内容: 我正在开发一个应用程序(Quartz调度程序),其中有一个作业类负责实际执行工作,我们需要在Quartz调度程序中创建触发器时告知/传递作业类的名称。 我想为所有想使用该API的人提供一个扩展点(除了我将作为API的一部分提供的一些通用作业之外)。这个想法是创建一个(标记)接口,如果有人想将其类声明为调度程序作业类,那么他们要做的就是(声明)实现该接口。 我不确定如何找到合约之后的类(

  • 问题内容: 范例: 我想从引用变量中获取接口名称。有没有办法做到这一点? 问题答案: 使用反射,您可以调用返回您的类实现的方法。 为了得到名字

  • 我需要在我的Spring引导应用程序中找到只实现一个特定接口的类。我面临的问题是,ClassPathBean定义扫描仪正在返回实现“扩展”子接口的类。 示例: 以下是我目前使用的代码: 现在的结果是数组字符串“beans”包含所有其他类,如F、G、H、I、J等。 如何以只返回只实现指定接口的选定类的方式构造我的TypeFitler,即过滤掉应用扩展接口的所有实现。例如B类,但E类除外。 以下是将C

  • 本文向大家介绍c#自定义Attribute获取接口实现示例代码,包括了c#自定义Attribute获取接口实现示例代码的使用技巧和注意事项,需要的朋友参考一下 一般的接口实现多态 定义接口 定义实现的类 一般实现的方法 升级版 添加自定义(这个网上好多) 实现类 调用方法 这个可以避免需要维护swich语句 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价

  • 我有两个表,和。一个可以有多个并且一个只属于一个。 在我的模型中,我有一个关系... 在我的模型中,我有一个关系... 现在,我想使用来连接这两个表,但需要第二个表中的特定列。我知道我可以使用查询生成器,但我不想这样做。 当我在模型中编写... 它将运行以下查询... 但我想要的是... 当我用... 它只返回第一个表中的列。我需要使用第二个表中的的特定列。我怎么能那样做?

  • 为了测试它,我创建了一个新的控制器,以避免干扰我正在工作的控制器TesteController2,它运行良好。因此,我的下一步是扩展IStudentRepository中的ICustomRepository,在TesteController2中进行更改,然后Spring将不再找到我的findCustom方法,它尝试将该方法创建为JPA关键字并返回和错误。这是我的存储库接口: 和TesteContr