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

Jsf 2 将JSF托管bean迁移到CDI托管bean,jsf-2,migration,cdi,managed-bean,omnifaces,Jsf 2,Migration,Cdi,Managed Bean,Omnifaces,我计划将web应用程序从使用JSF托管bean转换为使用CDI托管bean。我知道我需要做以下工作: 在WEB-INF中添加一个空的beans.xml文件 将所有JSF@ManagedBean替换为CDI@Named注释 用CDI或OmniFaces范围注释替换所有JSF范围注释 用CDI@Inject注释替换所有JSF@ManagedProperty 这就是我们需要做的一切吗?有什么我需要注意的地方吗?基本上,如果您已经在Java EE服务器上,这就是您需要做的所有事情。在Tomcat上,首先

我计划将web应用程序从使用JSF托管bean转换为使用CDI托管bean。我知道我需要做以下工作:

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

  • 这就是我们需要做的一切吗?有什么我需要注意的地方吗?

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

    需要注意以下问题:

    • 虽然OmniFaces 2.x“正式”要求JSF2.2,但OmniFaces 2.0/2.1在技术上向后兼容JSF2.1,在TomEE的案例中,OmniFaces 2.2也应该在带有JSF2.1的TomEE 1.x上工作,但OmniFaces 2.2有一个硬JSF2.2依赖项(由于新的
      标记)如果不将MyFacesJSF实现升级到兼容2.2的版本,或者自身升级到Tomee7.x,就不会部署到Tomee1.x上。另见

    • 当您使用多个WAR部署一个EAR,每个WAR都有自己的OmniFaces库时,通常所有CDI功能只在一个WAR中工作,因为WAR提供的库的CDI上下文被错误地解释为EAR范围。这是CDI规范中的一个疏忽,尚未在未来的CDI版本中修复。另见

    • 当您想在
      @facescoverter
      @FacesValidator
      中使用OmniFaces提供的CDI注入支持,并且要创建/使用与CDI 1.1兼容的
      beans.xml
      (因此不是CDI 1.0兼容的或空的),那么您需要确保已显式设置
      bean发现模式=
      beans.xml中的“all”
      。另请参阅

    • 在替换
      @ManagedBean(eager=true)
      时,请注意标准CDI对此没有直接等效项。您可以使用
      @Observes
      进行此操作。OmniFaces为此提供注释。另请参阅

    • 在JSF2.0/2.1/2.2中替换
      @ManagedProperty
      时,请注意不能注入
      {param.xxx}
      {cookie.xxx}
      {initParam.xxx}
      直接通过
      @Inject
      单独使用,而这仅仅是通过
      @ManagedProperty
      可以实现的。OmniFaces分别提供了,并用于此目的。只有在JSF 2.3中,才有一个新的
      @javax.faces.annotation.ManagedProperty
      注释,其使用方式与原始的
      @javax.faces.bean.ManagedPrope>完全相同rty
      自JSF2.3以来就被弃用了


    答案取决于所使用的服务器。例如,在Tomcat上,您也需要安装CDI。我使用的是TOMEE。因此,CDI已经可用。我更担心Web应用程序中的问题。很难测试应用程序的各个方面。因此,如果已知有问题,最好知道要小心。谢谢BalusC。我做了1-4,并且做了few测试和所有测试似乎都在运行。令人惊讶的是,无缝连接。旁注:我最近将此应用程序从Websphere 8.1(myfaces2.0)迁移到了TOMEE 1.7(myfaces2.1.17)。从那以后,我们一直遇到内存问题。由于堆最大化,TOMEE服务器在运行一周后挂起。我注意到内存转储中有很多ViewScope bean。我希望omnifaces的ViewScope可以帮助消除此问题。我只是不明白为什么Websphere中没有出现此问题。哦,好吧,谢谢你的指点。