【问题标题】:Are CDI and EJB really compatible?CDI 和 EJB 真的兼容吗?
【发布时间】:2015-03-31 08:26:33
【问题描述】:

我目前在 Wildfly 8.2.0.Final 上遇到 EJB 3.1 和 CDI 1.2 的一些问题。我认为 CDI 和 EJB 不能完全互操作,因为这在网络上随处可见。

我的设置如下:

EAR A
  |
  +- JAR A.1 (containing some Stateless Session Beans)
  +- JAR A.2 (containing some persistence things)

EAR B
  |
  +- JAR B.1 (containing some classes that use A.1)

更多信息:

  • A.1 的会话 bean 使用@EJB 注入同一模块的其他会话 bean
  • 为 A.1 激活 CDI
  • EAR B 有一个 jboss-deployment-structure.xml,它声明了从 B.1 到 A.1 的依赖关系。
  • 为 B.1 激活 CDI
  • 为了避免在模块 B.1 中对依赖项注入进行显式查找 (@EJB(lookup="java:global/...)),注入模块 A 的会话 bean (DAO)。 1 应使用 CDI 的 @Inject 完成。

现在这里有两个核心问题:

  1. 如果模块 A.1 包含一个 persistence.xml 并且激活了 CDI,当我尝试使用依赖项 B.1 -> A.1 部署模块 B 时,CDI 会抱怨缺少持久性单元
  2. 我认为 EJB 和 CDI 不完全兼容,因为如果我在另一个模块的类中注入无状态会话 bean(使用不同类加载器的不同部署),会话 bean 的 @EJB 注入将被忽略。
    • 在这种情况下,会话 bean 的类似乎是使用 CDI 而不是 EJB 实例化的。
    • 这似乎是 CDI 和 EJB 的主要不兼容之处,因为我不想关心 A.1 的 DAO 是如何实现的。我只想在我的应用程序中注入一个接口实例并使用它。

有谁知道如何解决这些问题或导致这种行为的原因?

非常感谢!

【问题讨论】:

  • 是什么让您认为 EAR A 中的任何内容都可以从 EAR B 访问?即使您设法通过 jboss-deployment-structure.xml 解决类加载问题,您也超出了规范的范围,我不希望有太多的注释处理可以工作。为什么不直接将 jar A.1 和 A.2 的副本放入 EAR B?

标签: jakarta-ee ejb cdi wildfly ejb-3.1


【解决方案1】:

理论上你可以让 EAR A 依赖于 EAR B(使用 jboss-deployment-structure.xml,通过向 deployment.ear.b 添加模块依赖或其他东西)。如果 EAR B 的 META-INF 包含 CDI 激活文件 (beans.xml),EAR A 可能会从 EAR B 注入依赖项。

在 JBoss AS7 和 WildFly 8 中,大多数情况下,部署可以被视为“普通”模块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2017-11-11
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    相关资源
    最近更新 更多