【发布时间】: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,在这种情况下专家建议是什么?
谢谢!
【问题讨论】: