当前位置: 首页 > 知识库问答 >
问题:

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

陈博容
2023-03-14

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

  1. 在WEB-INF中添加空beans.xml文件。
  2. 将所有JSF@ManagedBean替换为CDI@Named Annotations。
  3. 用CDI或OmniFaces作用域注释替换所有JSF作用域注释。
  4. 将所有JSF@ManagedProperty替换为CDI@Inject Annotations。

这就是需要做的吗?有什么我需要注意的问题吗?

共有1个答案

邹慈
2023-03-14

基本上,只要您已经在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依赖(由于新的 标记),如果不将其MyFaces JSF实现升级到兼容2.2的版本,或者不将其自身升级到TomEE 7.x,OmniFaces 2.2不会部署到TomEE 1.x上。另请参见OmniFaces兼容性矩阵。

    当您部署具有多个WAR的EAR,每个WAR都有自己的OmniFaces库时,通常所有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”。另请参见@facesconvertershowcase。

    替换@managedbean(eager=true)时,请注意标准CDI对此没有直接等价物。为此,您可以使用@observes。OmniFaces为此提供了@earge注释。另请参见如何配置启动托管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完全相同,而最初的@javax.faces.bean.ManagedProperty在JSF 2.3之后就被弃用了。

  •  类似资料:
    • 托管bean它是一个纯Java类,它包含一组属性和一组,方法。 以下是托管bean方法执行的常见功能: 验证组件的数据 处理组件触发的事件 执行处理以确定应用程序必须导航的下一页 它也可以作为JFS框架的模型。 JSF托管Bean示例 请看看下面一段示例代码 - 您可以通过以下方式使用此。 通过配置成XML文件。 通过使用注释。 通过XML文件配置托管Bean 在xml文件配置是比较旧方法。 在这

    • 主要内容:使用XML配置,使用@ManagedBean注解JSF 托管bean(Managed Bean)是JSF注册的常规Java Bean类。托管bean包含getter和setter方法,业务逻辑。JSF托管bean作为UI组件的Model。 它存储JSF xhtml页面使用的数据。借助JSF框架,可以从JSF页面访问托管Bean。 在JSF 1.2中,我们必须在JSF配置文件(如)中注册受管理的bean。 从JSF 2.0可以使用注解注册管理be

    • 我使用的是Maven、eclipse和WebSphere Application Server liberty V16.0.0.4,不知道哪里做错了,以下是相关文件: controller.java: index.xhtml: 就我所知,我已经做了所有正确的事情,我没有竞争的JSF或CDI实现,也没有使用JSF包中的任何作用域。我完全不知道为什么这不起作用...

    • 主要内容:实例,运行测试结果以下代码显示了如何进行bean注入。 我们先定义一个消息bean,它有一个字符串属性来存储消息。 然后我们再定义另一个托管bean,并使用注解注入。 实例 打开 NetBean8.2,创建一个名为: InjectManagedBeans 的工程,并加入以下文件代码。 以下是文件:UserBean.java 中的代码 - 以下是是文件:index.xhtml 中的代码 - 以下是文件:Message

    • 我在演示应用程序中使用了JSF2+Spring3.1+Hibernate4,我想使用注释来创建会话工厂,但是我的DAO类没有在Jsf托管Bea类中初始化,所以我得到了空指针异常。我的ApplicationContext.xml 现在,在Managedbean方法中,DAO对象为null,我得到的是null指针异常

    • 问题内容: 我是JSF的新手(2)。 在Struts中,我们可以从类似的URL调用动作。这将调用一个操作并返回一个结果页面,例如JSP(最初没有JSP / HTML)。 在JSF中如何做同样的事情?(我知道如何从.xhtml调用操作),即直接从URL调用托管bean并获取结果页面。 问题答案: 您要询问的模式并不是JSF工作方式的真正本机。 像Struts和Spring MVC这样的基于请求的框架