grails 2.4.2 - 域对象验证的时间点

时间:2016-06-22 09:41:41

标签: validation grails

我有一个域类,其中包含一些自定义验证程序,如下所示:

class Domain {
    String attribute1
    OtherDomain attribute2

    static constraints = {
        attribute2 nullable: true, validator: {OtherDomain od, Domain d ->
            if (od) {
                log.debug "entering validation"
                // certain validation here
            }
    }
}

为了更新,我在相应的DomainController中有一个简单的操作:

@Transactional
def update(Domain domainInstance) {
    log.debug "entering update()"
    // rest of update
}

我想知道为什么在debuglog我按以下顺序收到调试消息:

  1. entering validation
  2. entering update()
  3. 问题是此时验证失败(StackOverflowError)。我知道这个错误的原因,我知道如何绕过这个错误(在update行动中这样做)。但是,在程序进入update()操作之前,我不知道为什么会有验证。而且我现在还不知道如何阻止验证。

    你有什么建议吗?

1 个答案:

答案 0 :(得分:2)

您看到"进入验证的原因"之前的消息"进入更新()"是因为你声明了一个Domain类型的命令对象。这意味着Grails会将任何请求参数绑定到domainInstance,然后在执行操作之前调用validate() 。这允许您编写如下代码:

@Transactional
def update(Domain domainInstance) {
    // at this point request params have been bound and validate() has 
    // been executed, so any validation errors will be available in
    // domainInstance.errors

    if (domainInstance.hasErrors() {
        // do something
    }

    log.debug "entering update()"
}