【问题标题】:grails validate method on domain object域对象上的 grails 验证方法
【发布时间】:2010-11-19 08:41:29
【问题描述】:

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

class Person {
  Address address
}

class Address {
 String city
}

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

【问题讨论】:

    标签: grails validation


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2014-10-25
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-06
      • 1970-01-01
      相关资源
      最近更新 更多