validate() 和 hasErrors() 之间有啥联系

Posted

技术标签:

【中文标题】validate() 和 hasErrors() 之间有啥联系【英文标题】:What is the connection between validate() and hasErrors()validate() 和 hasErrors() 之间有什么联系 【发布时间】:2011-05-31 11:36:16 【问题描述】:

这个问题来自我的another question的问题。在那个问题中,我遇到了hasErrors() 函数不适用于非持久域类 的情况,即使在我按照the instruction,第 7.5 部分所做的所有事情之后。

按照 Victor 的方式,我通过调用 validate() 解决了这个问题,但我不明白它为什么会起作用。 Grails 文档似乎没有说明您应该在 hasErrors() 函数之前调用 validate() 。怎么会这样?

【问题讨论】:

【参考方案1】:

在询问对象是否为hasErrors(或save 用于正确的域对象,它在幕后调用validate)之前,需要调用validate 对我来说确实有意义。在此上下文中验证意味着“检查此对象是否有效,如果没有则指示任何错误”。

或者,每次对对象进行任何更改时,GORM 实现都必须调用validate,这对我来说是不太理想的行为,因为它可能涉及经常且不必要地完成大量工作(其中一些限制可能涉及大量工作)。

第 7.2 节的开头非常清楚地指出“要验证域类,您可以在任何实例上调用 validate 方法”。它还指出“在 Grails 中基本上有两个阶段的验证,第一阶段是数据绑定,当您将请求参数绑定到实例时发生......此时您可能已经在 errors 属性中出现错误,因为类型转换(例如将字符串转换为日期)。您可以检查这些并使用 Errors API 获取原始输入值。...验证的第二阶段发生在您调用 validate 或 save 时。这是 Grails 将验证绑定的时候值与您定义的约束相反。”

documentation for hasErrors 也提到了这一点。当您在documentation site 上时,您可以通过在左侧导航框架中找到方法调用来访问它。我总是建议查看这些以及更具描述性的用户指南页面,因为它们通常会提供更多细节。 Here's the page for the validate method 也是。

我从来没有遇到过直接调用validate 的问题——这对我来说非常清楚,我可以选择完成所有工作的点,我已准备好进行验证。我在任何地方都看不到更改此行为的选项,但是如果您希望自动或在某些条件下调用 validate,您可以通过将 invokeMethod 添加到类并拥有它来使用一些 Groovy 元编程魔法在传递某些调用之前调用validate。看看here 和here。 (但我不确定我是否会推荐它!请记住,您的类现在将依赖于在 GORM 验证框架中使用,因为 validate 方法可能不存在)。

【讨论】:

顺便说一下... Peter Led***(优秀的 Grails in Action 一书的作者之一)写了一系列关于 GORM 陷阱的精彩文章 - 非常值得一读以了解一些所有这些工作原理的详细信息:part 1、part 2 和 part 3。

以上是关于validate() 和 hasErrors() 之间有啥联系的主要内容,如果未能解决你的问题,请参考以下文章

humanInstance.hasErrors() 如何在 grails 2.3.0 控制器中的保存操作中执行休息和正常

重构 Grails 命令验证

在 grails 控制器中模拟命令对象导致 hasErrors() 无论如何都返回 false !请帮忙

Spring 视图层如何显示验证消息提示

如果 2 个条件为真,如何正确跳过步骤

Spring 视图层如何显示验证消息提示