【问题标题】:JSF PROCESS_VALIDATIONS and @RequestScoped issueJSF PROCESS_VALIDATIONS 和 @RequestScoped 问题
【发布时间】:2015-08-14 15:24:06
【问题描述】:

考虑以下用例。我正在使用 @RequestScoped 支持 bean 开发 JSF 表单。另外,我使用 PrimeFaces,但它与问题的关系不大。

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

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

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    这正是 @ViewScoped 存在的原因。

    如果您不想通过 @ViewScoped 使用 JSF 的“自动”视图状态管理,最好在每次回发期间手动维护 @RequestScoped bean 的 @PostConstruct 中的视图状态。您最多可以通过@ManagedProperty 注入参数。支持验证/转换的<f:viewParam> 远没有用处,因为它运行“太晚了”。

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

    另见:

    【讨论】:

    • 谢谢你,@BalusC,@Param 已经做到了!我将f:paramcommandButton 一起传递,然后将其设置在@PostConstruct 中。此外,我已经摆脱了 f:viewParam 和旧的 jsf xml 命名空间,它们在一些旧的 Mojarra 版本上存在问题。
    猜你喜欢
    • 2015-01-10
    • 2012-08-12
    • 2012-06-15
    • 2017-04-18
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    相关资源
    最近更新 更多