grails验证域对象的方法

时间:2010-11-19 08:41:30

标签: grails validation

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

class Person {
  Address address
}

class Address {
 String city
}

当我执行新的Address().validate()时,它返回false,但是当我执行new Person(address: new Address()).validate时,它返回true。

1 个答案:

答案 0 :(得分:7)

虽然目前没有为validate()save()方法记录“深度验证”,但它will be in future(该文档指出文档已丢失,但与文档相关完成1.3.x树)。有关这些方法的文档“deepValidate参数,然后是will state

  

@ deepValidate @(可选) - 确定   是否域名的关联   实例也应该被验证,   即是否验证级联或   不。这是@ true @默认 - 设置   到@ false @来禁用级联   验证

然而,测试表明,在任何这些情况下,“深度验证”都

  • 一对一协会
  • 一对多协会
    • 使用匹配的setter分配的关联对象
    • 使用匹配的addTo*(..)方法分配的关联对象,例如person.addToAddresses(..)
  • 同时使用validate()save()方法
    • 以及使用两种方法和明确的deepValidate: true参数

Similar findings have been published at another place,将“非行为”归类为“已知问题”。我自己的,全面的测试用例可以是downloaded from here

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

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

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