【问题标题】:CDI not working after migration to Java EE 7迁移到 Java EE 7 后 CDI 无法正常工作
【发布时间】:2013-07-07 07:59:28
【问题描述】:
我最近将一个简单的Java EE 6 项目迁移到Java EE 7。详细地说,这意味着我只是将依赖项从 javax:javaee-api:6.0 更改为 javax:javaee-api:7.0 并将其部署到 Glassfish 4 而不是 Glassfish 3。
之后应用程序不再工作,因为CDI 无法注入注解的依赖项。
【问题讨论】:
标签:
jakarta-ee
glassfish
cdi
java-ee-7
glassfish-4
【解决方案1】:
问题是,我不知道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 的行为类似于Java EE 6。
【解决方案3】:
要摆脱 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