java - JBoss 中的 EJB 特化

标签 java jakarta-ee dependency-injection jboss7.x cdi

我不久前在 Jboss 4.2.3 (JavaEE 5) 上下文中问过这个问题,并得到了尝试使用 Spring 进行配置的答案,但我不想在不需要时添加另一个框架。

现在,随着 JavaEE 6 和 7 的推出,我感觉有一个更简单的解决方案可以解决我的问题。不过,我的搜索还不够幸运,所以如果您能让我走上正轨,我将非常感谢您的帮助。

问题是这样的:

假设我们有一个 EJB 接口(interface) IEjb 和一个提供该接口(interface)的实现 EjbA 的库。还有其他几个库提供了更多 EJB,其中一些库包含 @EJB IEjb ref,即它们需要对公开接口(interface) IEjb 的 en EJB 的引用。

现在,需要完全用替代实现EjbB替换EjbA,即EjbA应该永远不会在整个应用程序中使用。

有一些选项我们无法使用或需要进行相当大的更改:

  • “不要部署包含 EjbA 的库”:这是不可能的,因为还需要其他 EJB
  • “从库中提取 EjbA”:这需要对我们的库和使用它们的应用程序进行相当大的更改
  • “将 EjbA 实现为非 EJB,在需要时对其进行子类化,并使该子类成为 EJB”:与上面的原因相同,这将需要相当大的更改
  • “删除EjbA”:还有其他应用程序需要使用它,目前只有一个应用程序应该使用替代品。

所以我可以想到以下几种方法:

  • 告诉服务器不要部署 EjbA,这样 IEjb 的唯一实现就是 EjbB 并且依赖注入(inject)就可以了
  • 告诉依赖注入(inject)在需要 IEjb 实例时始终使用 EjbB(类似于 CDI 的 @Specializes 但对于 EJB - 可能在JavaEE 7?)

对此有什么想法吗?这可能吗(我感觉是的),如果可能的话,如何实现?


关于环境的说明:我们目前在 JBoss 7.2.0 上运行,但如果这只能使用 Wildfly 才能实现,那么这可能是一个选项(尽管我们不希望被迫更新)。

最佳答案

一些想法:

  • 如果无论如何都不能使用 EjbA,请将其删除
  • 删除 EJB 注释
  • 使用@Inject注入(inject)本地EJB(无论如何推荐)。我认为 CDI 可以让您指定默认实现,据我所知。

关于java - JBoss 中的 EJB 特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23016898/

相关文章:

java - 在 Java 接口(interface)上调用 .class 时将 .class 传递给 Clojure 函数

java - IoC/DI 特别是 Spring : Autowire properties without setter/constructor

java - JPA 2.0/EclipseLink 和 sqlite 3.7.2 - 无法创建表

android - 处理基础 fragment 中的 Koin(模块已加载错误)

php - 如何在 Symfony 4 的控制台命令中使用记录器?

java - Spring JPA 存储库最近日期

java - 固定大小堆上操作的复杂性

java - Process.waitFor() 不等待执行的快捷方式 (.lnk)

java - 使用 CDI 注入(inject) PersistenceContext

java - 如何用 Java 查询 XML