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

Hoc*_*Lim 9 migration cdi jsf-2 managed-bean omnifaces

我打算将Web应用程序从使用JSF托管bean转换为使用CDI托管bean.我知道我需要在下面做:

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

是这一切都需要做吗?我需要注意哪些问题?

Bal*_*usC 5

基本上,只要您已经在Java EE服务器上,这就是您要做的所有事情。在Tomcat上时,您需要首先手动安装CDI。博客中详细介绍了Weld和OpenWebBeans的说明。如何在Tomcat中安装CDI?

需要注意以下事项:

  • 尽管OmniFaces 2.x“正式”需要JSF 2.2,但OmniFaces 2.0 / 2.1在技术上与JSF 2.1向后兼容,并且在TomEE的情况下也应在具有JSF 2.1的TomEE 1.x上工作,但是OmniFaces 2.2具有坚决的JSF 2.2依赖性(由于使用了新<o:viewAction>标签),因此,如果不将其MyFaces JSF实现升级到2.2兼容版本,或者将自身升级到TomEE 7.x,就无法在TomEE 1.x上进行部署。另请参见OmniFaces兼容性列表

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

  • 如果要在@FacesConverter或中使用OmniFaces提供的CDI注入支持@FacesValidator,并且要创建/使用与CDI 1.1兼容beans.xml(因此不与CDI 1.0兼容或为空),则需要确保您使用明确地设定bean-discovery-mode="all"beans.xml。另请参阅@FacesConverter展示柜

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

  • @ManagedProperty在JSF 2.0 / 2.1 / 2.2中进行替换时,请注意,您不能单独直接注入#{param.xxx}#{cookie.xxx}而只能#{initParam.xxx}通过注入。分别OmniFaces报价,并为宗旨。仅在JSF 2.3中,才有一个新的注释,该注释的使用方式与从JSF 2.3开始不推荐使用的原始注释完全相同。@Inject@ManagedProperty@Param@Cookie@ContextParam@javax.faces.annotation.ManagedProperty@javax.faces.bean.ManagedProperty