5

我最近将一个简单的Java EE 6项目迁移到Java EE 7. 详细地说,这意味着我只是将依赖项从javax:javaee-api:6.0to更改为javax:javaee-api:7.0并将其部署到Glassfish 4而不是Glassfish 3.

之后应用程序不再工作,因为CDI无法注入注释的依赖项。

4

3 回答 3

6

问题是,我不知道deployment descriptor查找依赖项的默认行为在Java EE 7.

deployment descriptor (beans.xml)的必须看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       version="1.1" bean-discovery-mode="all" >
</beans>

重要的是属性bean-discovery-mode,它配置如何CDI查找所有依赖项。将其设置为bean-discovery-mode="all"CDI其行为类似于 in Java EE 6

于 2013-07-09T15:58:59.927 回答
2

设置bean-discovery-mode="all"有效,但也可以设置为"annotated"取决于您的 bean 的设置方式。

或者您可以beans.xml完全消除以创建隐式存档。请参阅有关打包 CDI 应用程序的 Java EE 7 教程部分。要使用隐式存档,您需要在 bean 上定义范围注释。

于 2013-07-09T20:22:23.767 回答
2

要摆脱 beans.xml 文件并使您的注入在 Glassfish 4 上工作,您还必须更改范围的包:

javax.faces.bean.ApplicationScoped -> javax.enterprise.context.ApplicationScoped
javax.faces.bean.RequestScoped -> javax.enterprise.context.RequestScoped
javax.faces.bean.SessionScoped -> javax.enterprise.context.SessionScoped
javax.faces.bean.ViewScoped -> javax.faces.view.ViewScoped
于 2013-10-31T09:59:25.877 回答