我打算将Web应用程序从使用JSF托管bean转换为使用CDI托管bean。我知道我需要在下面做:
是否需要做所有这些?有什么问题我需要注意吗?
答案 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以来已弃用。