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

JSFPROCESS_VALIDATIONS和@RequestScoped问题

颜乐
2023-03-14

考虑下面的用例。我正在用< code>@RequestScoped后台bean开发JSF表单。此外,我使用素数脸,但它与问题没有太大关系。

表单字段中的值通过复杂的业务逻辑相互关联。即一个下拉列表中的值取决于另一个下拉列表中的值,或者一个字段的启用/禁用状态取决于另一个字段中的值。表格的内容取决于某些隐藏字段中的视图参数或值。

支持bean中的设置器将值写入数据模型构建器,getter调用构建器的build()方法,该方法以某种预定义的顺序应用值并返回不可变的数据模型。

@RequestScoped意味着在回发(无论是AJAX还是常规请求)时,表单的支持bean需要从null重建。它发生在UPDATE_MODEL_VALUES阶段。

例如,当我们使用选择菜单(JSF选择菜单或PrimeFaces选择菜单-无关紧要)或数据表时,麻烦就开始了。因为在< code>PROCESS_VALIDATIONS阶段(发生在< code>UPDATE_MODEL_VALUES之前),支持bean仍然没有设置值。提到的组件无法通过内置验证,因为请求值与[仍然为空]集合中的任何值都不对应(为selectOneMenu或dataTable或任何类似的内容提供内容)。

我想到的一个解决方案是使用backing bean的< code>@PostConstruct方法,我们可以手动读取必要的请求值并预先填充所需的集合。但这种解决方案似乎远非干净优雅。

此外,我也尝试过应用自定义虚拟验证器,但它似乎不能替代内置验证器,所以这不起作用。

在这种情况下,考虑到我想坚持使用< code>@RequestScoped,专家的建议是什么?

谢谢!

共有1个答案

刁浩言
2023-03-14

这正是@ViewScoped存在的原因。

如果您不想通过 @ViewScoped 使用 JSF 的“自动”视图状态管理,则最好在每次回发期间@PostConstruct@RequestScoped Bean 中手动维护视图状态。您最多可以通过@ManagedProperty注入参数。这

如果您使用的是CDI管理的bean,JSF实用程序库OmniFaces有一个CDI<code>@Param</code>,它也支持验证和转换,而不是<code>@ManagedProperty</code<。这可能会进一步减少@PostConstruct方法中的样板。

    < li >如何选择正确的bean范围? <李>无国籍在JSF有什么用? < Li > view param vs @ managed property(value = " # { param . id } ")

 类似资料:
  • 问题内容: 我正在学习使用JAX-RS进行一些轻松的api开发,并且对我的资源类有疑问。 我的理解是,我的资源类应该是RequestScoped,但是,当它是RequestScoped时,我对实体管理器的persist方法的调用将引发TransactionRequiredException。 如果我将资源类更改为无状态,那么一切都很好,并且实体管理器可以继续存在而不会出现任何问题。 我还是Java

  • 我有一个JAR文件,其中包含一个请求范围Bean。(一个注释为的类)。 我有另一个Web服务项目(作为WAR文件构建)。上述JAR文件位于WAR文件的文件夹中。 我试图的类到Web服务项目中的一个类中。 我正在得到一个 这两个项目都有JAR文件,WAR文件包含一个空的。我已经研究这个问题好几天了。请帮忙。 谢谢

  • 我有这些简单的页面: list.xhtml edit.xhtml 这个豆子: 因此,当我单击其中一个“编辑”按钮时,它会导航到“edit.jsf”,显示已填充的输入,但当我单击“更新”按钮时会出现以下错误: 请注意,我知道如何实现@ViewScope接口来管理CRUD操作,但这是一个简单的概念证明,我需要更好地理解JSF生命周期。 所以我希望“testBean”是@RequestScoped 更新

  • 我使用CDI注释定义了一个RequestScoped bean,如下所示。我有几个页面使用同一个bean。当我从一页导航到另一页时。bean obj保持不变。即使我更改了会话(使用不同的用户登录)。bean对象没有改变。 根据RequestScope定义,bean实例应该为每个新请求重新创建。我错过了什么? 我正在使用JSF/Primefaces。从create输入的值。导航到详细信息后可以看到x

  • CDI到达以执行类的构造函数。但是,请求字段未初始化(注入)。 我做错了什么?

  • 我有一个应用程序,它有一个EJB,它注入了由CDI生成的实体管理器。同一服务器(wildfly 9)/JVM上的另一个应用程序将使用此EJB从实体管理器获取结果。 EJB的第一次调用将返回预期结果。当调用返回时,它生成实体管理器,获取数据并再次处理实体管理器。由于关闭了实体管理器,该EJB的每个后续调用都将抛出一个错误。未对新实体经理进行生产/处置。 这是预期的巴哈维奥吗?我的代码中有错误吗? 这

  • 用户实体类: 用于访问数据库的外观类: 用户注入的资源类: 和泽西处理程序: 现在的问题是: 当我想访问用户时。站点列表,我得到了延迟加载异常。但很明显,因为User是由RequestScoped提供程序注入的,所以它应该使用相同的EntityManager会话刷新每个请求。正当 我是否可以将每个rest请求的用户实体注入到Rest处理程序类中?

  • 问题内容: 我一直在学习redis和node.js。我有两个问题,找不到令人满意的答案。 我的第一个问题是关于在node.js中重用Redis客户端。我找到了这个问题和答案:如何在socket.io中重用Redis连接,但还不足以让我满意。 现在,如果我在连接事件中创建redis客户端,它将为每个连接生成。因此,如果我有2万个并发用户,那么将有2万个Redis客户端。 如果我将其放在连接事件之外,