对关联的'hasMany'对象进行Grails验证

时间:2016-04-11 16:34:56

标签: validation grails

我的验证问题与此处描述的非常相似

https://schneide.wordpress.com/2010/09/20/gorm-gotchas-validation-and-hasmany/

但是我的域名中没有(或想要)List<Element> elements字段的重要区别。我的代码是

class Location {

    static hasMany = [pocs: LocationPoc]

    Integer id
    String address
    String city
    State state
    String zip
    ...

    static mapping = {
        ...
    }

    static constraints = {  
        def regEx = new RegEx()

        address blank: true, nullable: true, matches: regEx.VALID_ADDRESS_REGEX 
        city blank: true, nullable: true 
        state blank: true, nullable: true
        zip blank: true, nullable: true
        ...
    }
}

但是,如果我使用双层POC(联系点)保存/更新位置,我会遇到一些错误。我想在保存/更新位置时验证POC,但我不确定如何。我尝试了一些

的变种
pocs validator: {
    obj -> obj?.pocs?.each {
        if (!it.validate()) {
            return false
        }
    }
    return true
}

无济于事。如果没有在我的域List<LocationPoc> pocs上创建新字段,这是否可能?

2 个答案:

答案 0 :(得分:1)

你很亲密。问题是您需要定位要验证的属性而不是使用对象引用。它应该是这样的:

pocs validator: { val, obj, err ->
  val?.each {
    if (!it.validate()) return false
  }
}

答案 1 :(得分:0)

验证不会自动通过hasMany关联级联。为了获得免费验证,关系的另一方需要属于Location。

您没有包含您的LocationPOC课程,但是如果您修改了

Location location

static belongsTo = [location: Location]

然后,当您保存Location对象时,您将获得级联验证。

如果您无法在LocationPoc上设置belongsTo属性,并且需要使用自定义验证程序,则语法与上面的答案略有不同。

pocs validator: {val, obj ->
    val?.inject true, {acc,item -> acc && item.validate()}
}

validate的三个争论版本希望您向errorCollection添加错误。 https://grails.github.io/grails2-doc/2.5.6/ref/Constraints/validator.html

另外,使用.each内部的return语句并不像上面的示例那样工作。它只是退出闭包并开始下一次迭代。来自另一个答案的验证器只是返回val(val.each的结果只是val) 您需要遍历整个集合,寻找无效的选项。