迁移JSF托管的Bean到CDI托管的Bean

12
我计划将一个Web应用从使用JSF管理bean转换为使用CDI管理bean。我知道我需要执行以下操作:
  1. 在WEB-INF中添加一个空的beans.xml文件。
  2. 将所有JSF @ManagedBean替换为CDI @Named注释。
  3. 将所有JSF范围注释替换为CDI或OmniFaces范围注释。
  4. 将所有JSF @ManagedProperty替换为CDI @Inject注释。
这就是全部需要做的吗?有什么需要注意的地方吗?

答案取决于所使用的服务器。例如,在Tomcat上,您还需要安装CDI本身。 - BalusC
我正在使用TOMEE。因此,CDI已经可用。我更担心的是Web应用程序中的陷阱。测试应用程序的每个方面都很困难。因此,如果有已知的陷阱,最好知道要注意什么。 - HockChai Lim
1个回答

10
基本上,如果您已经在Java EE服务器上,则确实只需要这样做。当使用Tomcat时,您需要先手动安装CDI。有关Weld和OpenWebBeans的说明详见博客如何在Tomcat中安装CDI? 以下是需要注意的问题:
  • 虽然OmniFaces 2.x "正式"要求JSF 2.2,但是OmniFaces 2.0/2.1在技术上与JSF 2.1向后兼容,因此在TomEE 1.x上使用JSF 2.1时也应该可以工作。但是由于新的<o:viewAction>标签,OmniFaces 2.2有一个硬性的JSF 2.2依赖关系,在不升级其MyFaces JSF实现为2.2兼容版本或升级为TomEE 7.x的情况下,无法部署到TomEE 1.x上。请参见 OmniFaces Compatibility Matrix

  • 当您部署具有各自拥有OmniFaces库的多个WAR的EAR时,通常只有一个WAR中所有CDI功能都能正常工作,因为WAR提供的库的CDI上下文被错误地解释为EAR范围内的上下文。这是CDI规范中的一个疏忽,尚未在将来的CDI版本中修复。请参见 OmniFaces Known Issues (CDI)

  • 当您想要在@FacesConverter@FacesValidator中使用OmniFaces提供的CDI注入支持,并且您将创建/使用符合CDI 1.1的beans.xml(而不是符合CDI 1.0的或空的beans.xml)时,您需要确保已在beans.xml中明确设置了bean-discovery-mode="all"。请参见 @FacesConverter showcase

  • 当替换JSF 2.0/2.1/2.2中的@ManagedBean(eager=true)时,请注意标准CDI没有直接等价物。您将使用@Observes来实现这一点。OmniFaces为此提供了@Eager注释。请参见 How to configure a start up managed 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注释,可以与原始的@javax.faces.bean.ManagedProperty完全相同,后者自JSF 2.3以来已被弃用。


感谢BalusC。我完成了1-4,并进行了一些测试,所有东西似乎都在正常工作。这让我感到惊讶。顺便说一下:我最近将此应用程序从Websphere 8.1(myfaces2.0)迁移到TOMEE 1.7(myfaces 2.1.17)。自那时以来,我们一直遇到内存问题。TOMEE服务器在运行一周后挂起,由于堆达到最大值。我注意到在内存转储中有很多视图范围的bean。我希望Omnifaces的viewscoped可以帮助消除这个问题。我只是不明白为什么在Websphere中没有出现这个问题。哦,好吧,感谢你的指点。 - HockChai Lim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接