【问题标题】: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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-18
          • 2019-04-24
          相关资源
          最近更新 更多