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

时间:2016-03-22 13:18:00

标签: jsf-2 migration cdi managed-bean omnifaces

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

  1. 在WEB-INF中添加空beans.xml文件。
  2. 将所有JSF @ManagedBean替换为CDI @Named注释。
  3. 将所有JSF范围注释替换为CDI或OmniFaces范围注释。
  4. 将所有JSF @ManagedProperty替换为CDI @Inject注释。
  5. 是否需要做所有这些?有什么问题我需要注意吗?

1 个答案:

答案 0 :(得分:5)

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

以下问题需要注意:

  • 虽然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>标记)并且不会在TomEE 1.x上部署而不将其MyFaces JSF实现升级到2.2兼容版本,或者本身升级到TomEE 7.x.另请参阅OmniFaces Compatibility Matrix

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

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

  • 替换@ManagedBean(eager=true)时,请注意标准CDI与此无直接对等关系。您可以使用@Observes。 OmniFaces为此目的提供@Eager注释。另请参阅How to configure a start up managed bean?

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