我不久前在 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/