validate()和hasErrors()之间的联系是什么

Hoà*_*ong 8 grails grails-validation

这个问题来自我的另一个问题.在那个问题中,我遇到一种情况,即hasErrors()函数不适用于非持久域类,即使在我按照指令执行的所有操作之后,第7.5部分也是如此.

按照Victor的方式,我通过调用validate()修复了问题,但我不明白它为什么会起作用.Grails文档似乎没有说明你应该在hasErrors()函数之前调用validate().怎么会发生这种情况?

Mar*_*Dow 9

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

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

第7.2节的开头非常明确地说明"要验证域类,您可以在任何实例上调用validate方法".它还指出"在Grails内部基本上有两个阶段的验证,第一阶段是数据绑定,当你将请求参数绑定到一个实例上时会发生这种情况......此时你可能已经在errors属性中有错误了类型转换(例如将字符串转换为日期).您可以使用Errors API检查这些并获取原始输入值....第二阶段的验证发生在您调用validate或save时.这是Grails将验证绑定的时间值会再次限定您定义的约束."

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

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

  • 顺便说一句...... Peter Ledbrook(优秀的Grails in Action书籍的作者之一)撰写了一系列关于GORM Gotchas的文章 - 非常值得一读,以了解所有这些内容的一些细节:[第1部分](http://blog.springsource.com/2010/06/23/gorm-gotchas-part-1/),[第2部分](http://blog.springsource.com/2010/07/02/gorm-gotchas-part-2 /)和[part 3](http://blog.springsource.com/2010/07/28/gorm-gotchas-part-3/). (2认同)