【发布时间】:2016-04-29 12:13:17
【问题描述】:
我在 glassfish 3 中的 EJB 注入有一个奇怪的问题。也许我只是不完全理解我在做什么 :)
所以这是一个问题:我的项目由 2 个模块组成,这些模块将使用 gradle 进行组装。
- 模块 A
- 模块 B
模块 A 是一个常用的 glassfish 模块,也可以正常工作。模块 B 包含通用人员。模块 B 也是 A 的依赖项。模块 A 将作为 *.war 存档部署到 glassfish,而模块 B 作为 *.jar 存档位于适当的 lib 文件夹中:
module-a.war 和其中的一些 ../lib/module-b.jar
我想要的是:在模块 B 中创建一个“通用”无状态 bean 并在模块 A 中使用它。但是它不起作用......
在模块 B 中我创建了一个 bean:
@Stateless
public class GeneralPurposeBean {}
我尝试在模块 A 中使用它,如下所示:
...
@EJB
private GeneralPurposeBean genPurpBean;
...
所以我已经提到了 GeneralPurposeBean 在 *.jar 中
每次我尝试使用 bean 时都会失败并出现以下异常:
javax.ejb.CreateException: Could not create stateless EJB
当我将 bean 移动到模块 A 时,它工作正常,但我想与其他模块共享这个 bean,这将在未来开发。有人可以向我解释这里有什么问题吗?因此 bean 将被识别但无法创建。经过调试发现是这样的
JCDIServiceImpl#_createJCDIInjectionContext
不将 bean 识别为企业 bean。因此,*.war 中可直接访问的所有内容都将正确创建,但不会正确创建 *.jar 中的内容。
【问题讨论】:
-
将它们放入唯一的 EAR(企业存档)中,然后重试
-
尝试创建一个接口,用
@Remote注释,你的GeneralPurposeBean实现。然后,在您的 ModuleA 上,按以下方式使用它:@EJB GeneralPurposeBeanInterface genPurpBean;.
标签: java ejb code-injection glassfish-3