我最近将一个简单的Java EE 6
项目迁移到Java EE 7
。详细地说,这意味着我只是将依赖关系从javax:javaee-api:6.0
更改为javax:javaee-api:7.0
并将其部署到Glassfish 4
而不是Glassfish 3
。
之后应用程序不再起作用,因为CDI
无法注入带注释的依赖项。
答案 0 :(得分: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
的行为与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