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

时间:2016-09-06 18:14:05

标签: maven java-ee ejb cdi

我正在尝试将2个单独的WAR迁移到一个 EAR

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

每个WAR都包含相同的JAR库,其中包含许多 @Stateless EJB @Named CDI托管bean

情况

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和CDI托管bean的 ejb-cdi.jar ejb
  • 在pom.xml中将ejb-cdi.jar配置为 ejbModule
  • 将WAR1和WAR2配置为pom.xml
  • 中的 webModule
  • 将WAR1和WAR2配置为没有ejb-cdi.jar
  • 的瘦战
  • 通过使用 @Stateless(mappedName =" XX") @EJB(beanName =" XX")确保EJB查找成功

问题

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

经过一些阅读后,EAR文件中的EJB查找和CDI注入似乎与普通WAR文件完全不同。

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

我尝试过:

  • 将ejb-cdi.jar添加到类路径 - >现在,模糊定义了EJB
  • 让ejb-cdi.jar再次成为常规JAR - > EJB查找完全失败
  • 使用不同的分类器添加ejb-cdi.jar / lib - >现在,模糊定义了EJB

(我希望我不必重新组织JAR,因为我已经简化了这种情况,并且在实践中有超过1个这样的组合罐..)

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

1 个答案:

答案 0 :(得分:1)

我最终了解到出了什么问题:

某些EJB和CDI托管bean位于相同的ejb-cdi.jar JAR中。 对JAR进行了一些重组,将所有EJB放在一个JAR中,将其作为ejbModule放在/中。此ejbModule不再包含任何CDI托管bean。

CDI托管bean JAR最终在WAR或/ lib中,取决于具有skinnyWar设置的maven-war-plugin的决定,但两种方式都有效。

所以答案是:

正确重组EJB和CDI托管bean,将它们放在单独的JAR中,并将EJB jar标记为ejbModule。