2015-03-31 56 views
0

我目前在Wildfly 8.2.0.Final上面临EJB 3.1和CDI 1.2的一些问题。我认为CDI和EJB并不完全可以互操作,因为这在网络上到处都是。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使用@EJB的会话bean注入同一模块的其他会话bean
  • CDI是为A.1激活
  • EAR B有一个jboss-deployment-structure.xml,声明从B.1到A.1的依赖关系,aso。
  • 为B.1激活CDI
  • 为了避免在模块B.1中为依赖项注入显式查找(@EJB(lookup =“java:global/...)”,注入模块A.1的会话bean(DAO的)应采用CDI的@Inject做

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

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

有谁知道如何解决这些问题,或者是什么原因导致这种行为?

非常感谢!

+1

在EAR B中,什么让你觉得什么都可以从EAR B访问?即使你设法通过jboss-deployment-structure.xml来纠正类加载问题,你已经超出了规范的范围,我不会期望很多注释处理工作。为什么不把罐子A.1和A.2的副本放入EAR B? – 2015-04-01 14:10:12

回答

0

理论上你可以让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部署可以像“普通”模块一样对待。