将 JSF 托管 bean 迁移到 CDI 托管 bean

Migrate JSF managed beans to CDI managed beans

我计划将 Web 应用程序从使用 JSF 托管 bean 转换为使用 CDI 托管 bean。我知道我需要执行以下操作:

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

这就是所有需要做的吗?有什么我需要注意的问题吗?

基本上,如果您已经在 Java EE 服务器上,这确实是您需要做的所有事情。在 Tomcat 上,您需要先手动安装 CDI。 Weld 和 OpenWebBeans 的说明在博客 How to install CDI in Tomcat?

中有详细说明

需要注意以下问题:

  • 虽然 OmniFaces 2.x "officially" 需要 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。另见 OmniFaces Compatibility Matrix.

  • 当您部署一个具有多个 WAR 且每个都有自己的 OmniFaces 库的 EAR 时,通常所有 CDI 功能将仅在一个 WAR 作为WAR 提供的库被错误地解释为 EAR 范围。这是 CDI 规范中的疏忽,尚未在未来的 CDI 版本中修复。另见 OmniFaces Known Issues (CDI).

  • 当您想在 @FacesConverter@FacesValidator 中使用 OmniFaces 提供的 CDI 注入支持时,您将 create/use 兼容 CDI 1.1 beans.xml(因此不是 CDI 1.0 兼容的或空的),那么您需要确保已在 beans.xml 中明确设置 bean-discovery-mode="all"。另见 @FacesConverter showcase.

  • 替换 @ManagedBean(eager=true) 时,请注意标准 CDI 对此没有直接等效项。为此,您可以使用 @Observes。 OmniFaces 提供 @Eager annotation for the purpose. See also How to configure a start up managed bean?

  • 在 JSF 2.0/2.1/2.2 中替换 @ManagedProperty 时,请注意不能注入 #{param.xxx}#{cookie.xxx}#{initParam.xxx}直接通过 @Inject 单独使用,而这只能通过 @ManagedProperty 实现。 OmniFaces 分别为此目的提供 @Param, @Cookie and @ContextParam。仅在 JSF 2.3 中有一个新的 @javax.faces.annotation.ManagedProperty 注释,其使用方式与原始 @javax.faces.bean.ManagedProperty 完全相同,后者自 JSF 2.3 以来已被弃用。