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

时间:2010-12-28 08:04:38

标签: grails grails-validation

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

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

1 个答案:

答案 0 :(得分:9)

在向对象询问是validate(或hasErrors是否为正确的域对象,调用save之前,需要调用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或在某些条件下调用,您可以使用一些Groovy元编程魔法,可能会将invokeMethod添加到在传递某些调用之前,让它调用validate。看看herehere。 (不确定我会推荐这个!并且请记住,您的类现在将依赖于在GORM验证框架中使用,因为validate方法可能不存在)。