grails验证域对象的方法

pra*_*hap 4 validation grails

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

class Person {
  Address address
}

class Address {
 String city
}
Run Code Online (Sandbox Code Playgroud)

当我做新Address().validate()返回false但是当我做new Person(address: new Address()).validate它返回true.

rob*_*ert 7

虽然"深度验证"目前没有记录validate()save()方法,但它将来会出现(文档说明文档已经丢失,而与完整的1.3.x树相关).然后,这些方法deepValidate参数的文档将说明:

@ deepValidate @(可选) - 确定是否还应验证域实例的关联,即验证是否级联.默认情况下为@ true @ - 设置为@ false @以禁用级联验证.

但是,测试表明,在任何这些情况下都不会执行"深度验证" :

  • 一对一协会
  • 一对多协会
    • 使用匹配的setter分配的关联对象
    • 使用匹配addTo*(..)方法分配的关联对象,例如,person.addToAddresses(..)
  • 使用validate()save()方法,
    • 并且,使用两种方法和显式deepValidate: true参数

类似的研究结果已在另一个地方发表,将"非行为"归类为"已知问题".我可以从这里下载我自己的综合测试用例.

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

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

    static constraints = { 
        primaryAddress validator: { 
            it?.validate()
        }
        secondaryAddresses validator: {
            it?.every { it?.validate() }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)