我写了一个非常简单的测试用例,发现当我在域对象上调用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.
虽然"深度验证"目前没有记录validate()和save()方法,但它将来会出现(文档说明文档已经丢失,而与完整的1.3.x树相关).然后,这些方法deepValidate参数的文档将说明:
@ deepValidate @(可选) - 确定是否还应验证域实例的关联,即验证是否级联.默认情况下为@ true @ - 设置为@ false @以禁用级联验证.
但是,测试表明,在任何这些情况下都不会执行"深度验证" :
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)