我最近将一个简单的Java EE 6
项目迁移到Java EE 7
. 详细地说,这意味着我只是将依赖项从javax:javaee-api:6.0
to更改为javax:javaee-api:7.0
并将其部署到Glassfish 4
而不是Glassfish 3
.
之后应用程序不再工作,因为CDI
无法注入注释的依赖项。
我最近将一个简单的Java EE 6
项目迁移到Java EE 7
. 详细地说,这意味着我只是将依赖项从javax:javaee-api:6.0
to更改为javax:javaee-api:7.0
并将其部署到Glassfish 4
而不是Glassfish 3
.
之后应用程序不再工作,因为CDI
无法注入注释的依赖项。
问题是,我不知道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
。
设置bean-discovery-mode="all"
有效,但也可以设置为"annotated"
取决于您的 bean 的设置方式。
或者您可以beans.xml
完全消除以创建隐式存档。请参阅有关打包 CDI 应用程序的 Java EE 7 教程部分。要使用隐式存档,您需要在 bean 上定义范围注释。
要摆脱 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