【问题标题】:How do I inject a local stateless session bean into a JAX-RS resource using CDI?如何使用 CDI 将本地无状态会话 bean 注入 JAX-RS 资源?
【发布时间】:2012-06-10 01:06:00
【问题描述】:

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

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

我在那个lib 目录中有另一个.jar 文件。它包含一个名为UserInfoResource 的类,它是一个JAX-RS 资源类。该类内部包含以下内容:

@Inject
private UserInfoManager userManager;

接下来,我在 .ear 文件的根目录下有一个 EJB .jar 文件。它包含一个名为UserManagerBean 的类,它实现了UserInfoManager 接口。此类使用 @Stateless 进行注释,基本上没有其他注释(因此使其成为通过其本地业务接口 (UserInfoManager) 公开的本地无状态会话 bean。此 .jar 文件也有一个 META-INF/beans.xml 文件。

接下来,我有一个 .war 文件,其中包含一个 Application 类,仅此而已。这充当在部署时发现的所有 JAX-RS 资源的“安装点”,这些资源存在于 lib 目录中。我没有将此 Java EE 6 模块声明为 CDI bean 存档,因为它不包含 bean。

这种符合规范的安排在部署时失败。 Weld(GlassFish 3.1.2 中的 CDI 实现)声称无法满足上面详述的注入点,因为没有可用的 UserInfoManager 的已知实现。

当该注入点改为使用@EJB 注释时,一切正常。

如何让 CDI 将本地无状态会话 bean 引用注入到类路径中存在的 JAX-RS 资源中?

更新:因为无论我怎么看这似乎都违反了规范,我有filed a bug with a testcase attached。我鼓励读者看一看,看看他们是否可以让它发挥作用。

更新: 解决方法是确保您的 JAX-RS 类不是 bean 档案,但 带有 @ManagedBean 注释.此外,作为其挂载点的 {{.war}} 文件必须是一个 bean 归档文件(必须有一个 {{WEB-INF/beans.xml}} 文件)。这些要求的某些组合是违反 CDI 规范的。以下错误跟踪这些问题:http://java.net/jira/browse/GLASSFISH-18793

【问题讨论】:

  • UserInfoResource 是否声明为@RequestScoped?
  • 你好;不;我没有在UserInfoResource 中添加任何 CDI 注释。
  • 我做了建议的改变;结果没有区别。
  • 你的耳朵里有定义application.xml吗?您提到了 jar 文件和 war 文件的位置,但没有提到它们在 ear 的 application.xml 中是如何定义的。
  • 是的,我愿意(它是 Maven 在版本 6 中自动生成的)。如果没有 CDI 注入,JAX-RS 资源和 EJB 可以正常工作。我在这里提交了一个带有测试用例的错误:java.net/jira/browse/GLASSFISH-18793 请随时查看。

标签: glassfish jersey java-ee-6 cdi jboss-weld


【解决方案1】:

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

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

【讨论】:

  • 感谢您的努力。虽然通过您的更改,我可以部署应用程序,但实际资源的任何调用仍会导致 NullPointerException
  • 忘了注意你需要将 beans.xml 添加到你的战争的 WEB-INF 文件夹中。这样注射也应该起作用。
  • 谢谢你的帮助,马丁。我在 GlassFish 问题页面上总结了各种 GlassFish 错误和规范解释问题:java.net/jira/browse/…
  • 我会接受你的回答,因为它让我工作;但是对于其他读者,请查看相关错误:java.net/jira/browse/GLASSFISH-18793 其中包含对 JAX-RS 和 CDI 可移植性的许多含义。
  • 我相信 JBoss AS7.1.0 上的 JAX-RS 类也有同样的问题。 EE6 教程(可能不正确)说 JAX-RS 类应该用 @RequestScoped 注释以启用 CDI,但这在 AS7 上不起作用。 JAX-RS 类必须使用 @ManagedBean 进行注释,或者自己创建会话 bean (@Stateless),然后 @EJB 注入按预期工作。
猜你喜欢
  • 2015-05-05
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多