我写了一个非常简单的测试用例,发现当我在域对象上调用validate时,Grails只进行浅层验证。我可以在grails中进行深度验证吗?有谁能够帮我?
class Person {
Address address
}
class Address {
String city
}
当我执行新的Address().validate()
时,它返回false,但是当我执行new Person(address: new Address()).validate
时,它返回true。
答案 0 :(得分:7)
虽然目前没有为validate()
和save()
方法记录“深度验证”,但它will be in future(该文档指出文档已丢失,但与文档相关完成1.3.x树)。有关这些方法的文档“deepValidate
参数,然后是will state:
@ deepValidate @(可选) - 确定 是否域名的关联 实例也应该被验证, 即是否验证级联或 不。这是@ true @默认 - 设置 到@ false @来禁用级联 验证
然而,测试表明,在任何这些情况下,“深度验证”都不:
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() }
}
}
}