我有一个.ear
包含标准lib
目录的文件。
我.jar
在那个lib
目录中有一个文件。它包含UserInfoManager
,这是一个接口。它不包含(出于这些目的)其他类。它还包含一个META-INF/beans.xml
文件。
我.jar
在该lib
目录中有另一个文件。它包含一个名为UserInfoResource
JAX-RS 资源类的类。该类内部包含以下内容:
@Inject
private UserInfoManager userManager;
接下来,我在.jar
文件的根目录有一个 EJB.ear
文件。它包含一个名为UserManagerBean
实现UserInfoManager
接口的类。这个类被注释了@Stateless
,基本上没有其他注释(因此使它成为一个通过其本地业务接口(UserInfoManager
)公开的本地无状态会话 bean。这个.jar
文件也有一个META-INF/beans.xml
文件。
接下来,我有一个.war
文件,里面有一个Application
类,没有别的。这充当lib
目录中存在的部署时发现的任何和所有 JAX-RS 资源的“安装点”。我没有将此 Java EE 6 模块声明为 CDI bean 存档,因为它不包含 bean。
这种符合规范的安排在部署时失败。Weld(GlassFish 3.1.2 中的 CDI 实现)声称无法满足上面详述的注入点,因为没有UserInfoManager
可用的已知实现。
当该注入点被注释时@EJB
,一切正常。
如何让 CDI 将本地无状态会话 bean 引用注入到类路径中存在的 JAX-RS 资源中?
更新:因为无论我怎么看这似乎都违反了规范,我已经提交了一个带有测试用例的错误。我鼓励读者看一看,看看他们是否可以让它发挥作用。
更新:解决方法是确保您的 JAX-RS 类不是bean 档案,而是使用@ManagedBean
. 此外,作为挂载点的 {{.war}} 文件必须是一个 bean 归档文件(必须有一个 {{WEB-INF/beans.xml}} 文件)。这些要求的某些组合是违反 CDI 规范的。以下错误跟踪这些问题:http: //java.net/jira/browse/GLASSFISH-18793