8

这个问题来自我的另一个问题的问题。在那个问题中,我遇到了一种情况,即hasErrors()function 不适用于non-persistent domain class,即使我按照第7.5 部分的说明做了所有事情。

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

4

1 回答 1

9

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

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

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

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

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

于 2010-12-28T09:02:01.630 回答