将 JSF 管理的 Bean 迁移到 CDI 管理的 Bean



我计划将 Web 应用程序从使用 JSF 托管 Bean 转换为使用 CDI 托管 Bean。我知道我需要做以下事情:

  1. 在 WEB-INF 中添加一个空的 bebe.xml 文件。
  2. 将所有 JSF @ManagedBean替换为 CDI @Named注释。
  3. 将所有 JSF 作用域注释替换为 CDI 或 OmniFaces 作用域注释。
  4. 将所有 JSF @ManagedProperty替换为 CDI @Inject注释。

这就是所有需要做的事情吗? 有什么需要注意的吗?

基本上,只要您已经在Java EE服务器上,这确实是您需要做的。在Tomcat上时,您需要先手动安装CDI。有关 Weld 和 OpenWebBeans 的说明,请参阅博客 如何在 Tomcat 中安装 CDI?

需要注意以下问题:

    虽然OmniFaces 2.x"正式"需要JSF 2.2,但OmniFaces 2.0/2.1在技术上与JSF 2.1向后兼容,并且在TomEE的情况下也应该在TomEE 1.x上使用JSF 2.1,但是OmniFaces 2.2具有硬JSF 2.2
  • 依赖项(由于新的<o:viewAction>标签),并且不会在TomEE 1.x上部署,除非将其MyFaces JSF实现升级到2.2兼容版本, 或自身升级到 TomEE 7.x。另请参阅全面兼容性矩阵。

  • 当您部署具有多个 WAR 的 EAR,每个 WAR 都有自己的 OmniFaces 库时,通常所有 CDI 功能都将在一个 WAR 中工作,因为 WAR 提供的库的 CDI 上下文被错误地解释为 EAR 范围。这是 CDI 规范中的疏忽,尚未在未来的 CDI 版本中修复。另请参阅全面已知问题 (CDI)。

  • 当您想在@FacesConverter@FacesValidator中使用 OmniFaces 提供的 CDI 注入支持时,您将创建/使用 CDI 1.1 兼容beans.xml(因此不是与 CDI 1.0 兼容的或空的),那么您需要确保已在 beans.xml 中显式设置了bean-discovery-mode="all"。另请参阅@FacesConverter展示。

  • 替换@ManagedBean(eager=true)时,请注意标准 CDI 没有直接等价物。为此,您将使用@Observes。OmniFaces为此目的提供了@Eager注释。另请参阅如何配置启动受管 Bean?

  • 在 JSF 2.0/2.1/2.2 中替换@ManagedProperty时,请注意,您不能仅通过@Inject直接注入#{param.xxx}#{cookie.xxx}#{initParam.xxx},而这只能通过 @ManagedProperty 来实现。OmniFaces分别提供@Param@Cookie@ContextParam。只有在 JSF 2.3 中,才有一个新的@javax.faces.annotation.ManagedProperty注释,它可以与自 JSF 2.3 以来弃用的原始@javax.faces.bean.ManagedProperty完全相同。

最新更新