域对象上的grails验证方法

域对象上的grails验证方法,grails,validation,Grails,Validation,我编写了一个非常简单的测试用例,发现当我对域对象调用validate时,Grails只执行一个浅层验证。我可以在grails中进行深度验证吗?有人能帮我吗 class Person { Address address } class Address { String city } 当我执行newAddress().validate()时,它返回false,但当我执行newperson(Address:new Address()).validate时,它返回true。虽然当前没有为和方法

我编写了一个非常简单的测试用例,发现当我对域对象调用validate时,Grails只执行一个浅层验证。我可以在grails中进行深度验证吗?有人能帮我吗

class Person {
  Address address
}

class Address {
 String city
}
当我执行new
Address().validate()
时,它返回false,但当我执行newperson(Address:new Address()).validate时,它返回true。

虽然当前没有为和方法记录“深度验证”,但(文档说明文档已丢失,但与完整的1.3.x树相关)。关于这些方法的文档“
deepValidate
参数,然后:

@deepValidate@(可选)-确定 是否存在域的关联 实例也应该进行验证, i、 e.验证是级联还是级联 不是。默认情况下,这是@true@设置 若要禁用级联,请单击“false” 验证

然而,测试表明,在以下任何情况下均不进行“深度验证”:

  • 一对一协会
  • 一对多协会
    • 使用匹配的setter指定的关联对象
    • 使用匹配的
      addTo*(..)
      方法指定的关联对象,例如
      person.addtoAddresss(..)
  • 使用
    validate()
    save()
    方法,
    • 而且,使用这两种方法和显式的
      deepValidate:true
      参数
,将“非行为”归类为“已知问题”。我自己的、全面的测试用例可以

最后,解决方案是手动调用子对象上的验证:

class Person {
    Address primaryAddress
    static hasMany = [secondaryAddresses: Address]

    static constraints = { 
        primaryAddress validator: { 
            it?.validate()
        }
        secondaryAddresses validator: {
            it?.every { it?.validate() }
        }
    }
}