EAR中的CDI + EJB失败:不满意的依赖关系

问题描述:

我正在尝试将两个独立的WAR迁移到一个EAREAR中的CDI + EJB失败:不满意的依赖关系

在WebLogic 12.2.1上运行,因此Java EE 7(CDI 1.1和EJB 3.1)。

每个WAR包含含有许多@Stateless EJB的@Named CDI管理的Bean同一个JAR库:

形势

WAR1 
|- WEB-INF/lib/ejb-cdi.jar  (type=jar) 
|- WEB-INF/lib/**.jar 

WAR2 
|- WEB-INF/lib/ejb-cdi.jar  (type=jar) 
|- WEB-INF/lib/**.jar 

在旧的情况2 WAR的分别部署一切正常。

现在,我必须打包2 WAR的成1个EAR文件,这将是这个样子:

EAR 
|- WAR1.war      (skinny, without ejb-cdi.jar) 
|- WAR2.war      (skinny, without ejb-cdi.jar) 
|- ejb-cdi.jar     (type=ejb) 
|- lib/**.jar 

我进行一些必要步骤:

  • 改变了包装类型ejb for ejb-cdi.jar包含EJB和CDI托管的豆
  • 配置ejb-cdi.jar为ejbModul È在pom.xml中
  • 在pom.xml中
  • 配置的WAR1和WAR2作为瘦战争没有EJB-cdi.jar配置WAR1和WAR2作为webModule
  • 确保EJB查找是成功的,通过使用@Stateless(mappedName = “XX”)@EJB(beanName = “XX”)

问题

EJB查找工作和EAR启动。在启动过程中我所有的CDI @Inject小号失败,出现以下异常:

org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied 
dependencies for type MyBean with qualifiers @Default 
    at injection point [BackedAnnotatedField] @Inject private my.package.Foo.myBean 

经过一番阅读似乎EJB查找和CDI注射在EAR文件的处理要比在普通的WAR文件完全不同。

我认为,因为ejb-cdi.jar不在清单中的类路径中,所以托管的bean是未知的。

我曾尝试:

  • 添加EJB-cdi.jar到类路径 - 现在> EJB的被模糊地定义
  • 再次腾出EJB-cdi.jar常规JAR - > EJB查询完全失败
  • 添加EJB-cdi.jar有不同的分类,以额外的/ lib目录 - 现在> EJB的被模糊地定义

(我希望我没有改组JAR,因为我已经简化了情况和实践中有超过1个这样的组合罐子。)

在EJB和CDI工作正常的情况下,获得EAR的最佳解决方案是什么?

+0

听起来像一个经典的类加载问题。让我猜 - 在EJB档案中,您正尝试访问(注入)WAR存档中的bean? – Siliarus

+0

我知道这不是一个答案,但是...您能否将包装从EAR移动到WAR? –

我结束我明白了什么问题:

一些EJB的和CDI管理的bean在同一个EJB-JAR cdi.jar。 对JAR进行了一些重构,将所有EJB放在一个JAR中,并将其作为ejbModule放入/。这个ejbModule不再包含任何CDI托管的bean。

CDI管理的bean JAR结束于WAR或in/lib中,具体取决于带有skinnyWar设置的maven-war-plugin,但这两种方式都有效。

所以,答案是这样的:

改组的EJB和CDI管理的bean得当,把它们放在不同的JAR和标记EJB水瓶中的ejbModule。