【发布时间】:2015-03-31 08:26:33
【问题描述】:
我目前在 Wildfly 8.2.0.Final 上遇到 EJB 3.1 和 CDI 1.2 的一些问题。我认为 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 的会话 bean 使用@EJB 注入同一模块的其他会话 bean
- 为 A.1 激活 CDI
- EAR B 有一个 jboss-deployment-structure.xml,它声明了从 B.1 到 A.1 的依赖关系。
- 为 B.1 激活 CDI
- 为了避免在模块 B.1 中对依赖项注入进行显式查找 (@EJB(lookup="java:global/...)),注入模块 A 的会话 bean (DAO)。 1 应使用 CDI 的 @Inject 完成。
现在这里有两个核心问题:
- 如果模块 A.1 包含一个 persistence.xml 并且激活了 CDI,当我尝试使用依赖项 B.1 -> A.1 部署模块 B 时,CDI 会抱怨缺少持久性单元
- 这就是我将持久性声明外包给 A.2 的原因,这是一个丑陋的解决方法,但我可以接受。
- 看到这个错误:https://issues.jboss.org/browse/WELD-1851
- 我认为 EJB 和 CDI 不完全兼容,因为如果我在另一个模块的类中注入无状态会话 bean(使用不同类加载器的不同部署),会话 bean 的 @EJB 注入将被忽略。
- 在这种情况下,会话 bean 的类似乎是使用 CDI 而不是 EJB 实例化的。
- 这似乎是 CDI 和 EJB 的主要不兼容之处,因为我不想关心 A.1 的 DAO 是如何实现的。我只想在我的应用程序中注入一个接口实例并使用它。
有谁知道如何解决这些问题或导致这种行为的原因?
非常感谢!
【问题讨论】:
-
是什么让您认为 EAR A 中的任何内容都可以从 EAR B 访问?即使您设法通过 jboss-deployment-structure.xml 解决类加载问题,您也超出了规范的范围,我不希望有太多的注释处理可以工作。为什么不直接将 jar A.1 和 A.2 的副本放入 EAR B?
标签: jakarta-ee ejb cdi wildfly ejb-3.1