CDI和EJB真的兼容吗?

时间:2015-03-31 08:26:34

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

我目前在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的依赖关系,aso。
  • 为B.1
  • 激活CDI
  • 为了避免在模块B.1中对依赖注入进行显式查找(@EJB(lookup =" java:global / ...)),注入会话bean(DAO)模块A.1应使用CDI的@Inject。
  • 完成

现在有两个核心问题:

  1. 如果模块A.1包含persistence.xml并且激活了CDI,那么一旦我尝试使用依赖关系B.1部署模块B,CDI就会抱怨缺少持久性单元。 A.1
  2. 我认为EJB和CDI并不完全兼容,因为如果我在另一个模块的一个类中注入一个无状态会话bean(使用不同的类加载器进行不同的部署),那么会忽略会话bean的@EJB注入。
    • 在这种情况下,似乎会话bean的类使用CDI而不是EJB进行实例化。
    • 这似乎是CDI和EJB的主要不兼容性,因为我不想关心如何实现A.1的DAO。我只想在我的应用程序中注入一个接口实例并使用它。
  3. 有谁知道如何解决这些问题或导致此行为的原因?

    非常感谢!

1 个答案:

答案 0 :(得分:0)

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

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