EAR 中的 CDI + EJB 失败:不满足的依赖关系
CDI + EJB in EAR fails: Unsatisfied dependencies
我正在尝试将 2 个单独的 WAR 迁移到一个 EAR。
运行 在 WebLogic 12.2.1 上,因此 Java EE 7(CDI 1.1 和 EJB 3.1)。
每个 WAR 包含相同的 JAR 库,其中包含许多 @Stateless EJB 的 和 @Named CDI managed beans:
情况
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 的包装类型更改为 ejb-cdi.jar 包含 EJB 和 CDI 管理的 bean
- 在 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 @Injects 都失败了,并出现以下异常:
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 个这样的组合 jar..)
获得 EJB 和 CDI 正常工作的 EAR 的最佳解决方案是什么?
我终于明白哪里出了问题:
一些 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。
我正在尝试将 2 个单独的 WAR 迁移到一个 EAR。
运行 在 WebLogic 12.2.1 上,因此 Java EE 7(CDI 1.1 和 EJB 3.1)。
每个 WAR 包含相同的 JAR 库,其中包含许多 @Stateless EJB 的 和 @Named CDI managed beans:
情况
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 的包装类型更改为 ejb-cdi.jar 包含 EJB 和 CDI 管理的 bean
- 在 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 @Injects 都失败了,并出现以下异常:
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 个这样的组合 jar..)
获得 EJB 和 CDI 正常工作的 EAR 的最佳解决方案是什么?
我终于明白哪里出了问题:
一些 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。