Grails领域对象上的验证方法

4

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

class Person {
  Address address
}

class Address {
 String city
}

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

1个回答

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() }
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接