3

我有一个.ear包含标准lib目录的文件。

.jar在那个lib目录中有一个文件。它包含UserInfoManager,这是一个接口。它不包含(出于这些目的)其他类。它还包含一个META-INF/beans.xml文件。

.jar在该lib目录中有另一个文件。它包含一个名为UserInfoResourceJAX-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

4

1 回答 1

3

Jersey 不会将 Resources 视为托管 bean,除非附加了显式范围/@ManagedBean 注释。因此,您需要使用 @ManagedBean 或 @RequestScoped 注释您的资源,以便注入工作。

似乎只有在资源 jar 文件中包含 beans.xml 时才会出现问题。当我删除它并将@ManagedBean 注释附加到资源类时(而不是@RequestScoped,因为如果没有beans.xml 存在@RequestScoped 不起作用),它就起作用了。我不是 CDI 专家,所以不确定这是设计的还是错误的。

于 2012-06-10T15:54:58.377 回答