【发布时间】: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