将 JSF 托管 bean 迁移到 CDI 托管 bean
Migrate JSF managed beans to CDI managed beans
我计划将 Web 应用程序从使用 JSF 托管 bean 转换为使用 CDI 托管 bean。我知道我需要执行以下操作:
- 在 WEB-INF 中添加一个空的 beans.xml 文件。
- 将所有 JSF @ManagedBean 替换为 CDI @Named 注释。
- 用 CDI 或 OmniFaces 范围注释替换所有 JSF 范围注释。
- 将所有 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 以来已被弃用。
我计划将 Web 应用程序从使用 JSF 托管 bean 转换为使用 CDI 托管 bean。我知道我需要执行以下操作:
- 在 WEB-INF 中添加一个空的 beans.xml 文件。
- 将所有 JSF @ManagedBean 替换为 CDI @Named 注释。
- 用 CDI 或 OmniFaces 范围注释替换所有 JSF 范围注释。
- 将所有 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.1beans.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 以来已被弃用。