将JSF托管的bean迁移到CDI托管的bean
我打算将使用JSF托管bean的Web应用程序转换为使用CDI托管的bean。 我知道我需要做下面的事情:
这是否需要完成? 是否有任何我需要注意的陷阱?
基本上,只要你已经在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>
标记),并且不会在TomEE 1.x上进行部署,而无需将其MyFaces JSF实现升级到2.2兼容版本,或者将其本身升级到TomEE 7.x. 另请参阅OmniFaces兼容性矩阵。
当您将EAR与每个自己的OmniFaces库一起部署多个WAR时,通常所有CDI功能都只能在一个WAR中工作,因为WAR提供的库的CDI上下文被错误地解释为EAR范围。 这是CDI规范中的一个疏忽,尚未在未来的CDI版本中修复。 另请参阅OmniFaces已知问题(CDI)。
当您想在@FacesConverter
或@FacesValidator
使用OmniFaces提供的CDI注入支持时,您将创建/使用兼容CDI 1.1的beans.xml
(因此不是CDI 1.0兼容的或空的),那么您需要确保已在beans.xml
显式设置bean-discovery-mode="all"
。 另请参阅@FacesConverter
展示。
当替换@ManagedBean(eager=true)
,请注意标准CDI没有与此等效的功能。 OmniFaces为此目的提供@Eager
注释。
当替换@ManagedProperty
,请注意您不能直接通过@Inject
注入#{param.xxx}
, #{cookie.xxx}
和#{initParam.xxx}
,而只能通过@ManagedProperty
。 OmniFaces分别为此提供了@Param
, @Cookie
和@ContextParam
。