【问题标题】:Grails validation on an associated 'hasMany' object对关联的“hasMany”对象进行 Grails 验证
【发布时间】:2016-04-11 16:34:56
【问题描述】:

我遇到了一个与此处描述的非常相似的验证问题

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 上创建新字段,这是否可行?

【问题讨论】:

  • pocs validator: { val, obj, err -> val?.each { if (!it.validate()) return false; ...} } 不适合你?
  • 使用val, obj, err -> val?.each 成功了!非常感谢。我以为我在正确的轨道上。

标签: validation grails


【解决方案1】:

你已经接近了。问题是您需要针对要验证的属性而不是使用对象引用。它应该是这样的:

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

【讨论】:

  • 这个验证器返回 "val" 而不是 it.validate() 的结果。加上验证器的三个参数版本,您需要直接修改 errorObject。我想你想要pocs validator: {val, obj -> val?.inject true, {acc,item -> acc && item.validate()}}
【解决方案2】:

验证不会自动通过 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) 您需要遍历整个集合以寻找无效的选项。

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-06
    • 2012-02-21
    • 1970-01-01
    相关资源
    最近更新 更多