EAR中的CDI + EJB失败:不满意的依赖关系
问题描述:
我正在尝试将两个独立的WAR迁移到一个EAR。EAR中的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的最佳解决方案是什么?
答
我结束我明白了什么问题:
一些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。
听起来像一个经典的类加载问题。让我猜 - 在EJB档案中,您正尝试访问(注入)WAR存档中的bean? – Siliarus
我知道这不是一个答案,但是...您能否将包装从EAR移动到WAR? –