我计划将 Web 应用程序从使用 JSF 托管 Bean 转换为使用 CDI 托管 Bean。我知道我需要做以下事情:
- 在 WEB-INF 中添加一个空的 bebe.xml 文件。
- 将所有 JSF @ManagedBean替换为 CDI @Named注释。
- 将所有 JSF 作用域注释替换为 CDI 或 OmniFaces 作用域注释。
- 将所有 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
完全相同。