迁移到Java EE 7后,CDI无法正常工作

时间:2013-07-09 15:59:00

标签: java-ee glassfish cdi java-ee-7 glassfish-4

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

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

3 个答案:

答案 0 :(得分:6)

问题是,我不知道deployment descriptorJava 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中的行为相同。

答案 1 :(得分:2)

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

或者您可以完全消除beans.xml来创建隐式存档。请参阅Java EE 7 Tutorial section on packaging CDI applications。要使用隐式存档,您需要在bean上使用范围定义注释。

答案 2 :(得分: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