【问题标题】:Order of validations验证顺序
【发布时间】:2017-08-10 19:25:36
【问题描述】:

执行验证的顺序是否始终相同?它是如何排序的?

对于这些约束:

static constraints = {
   A ...
   B ...
   C ...
}

它们总是按照 A -> B -> C 的顺序执行吗?

我为什么需要它?

A 的验证中,我需要检查数据库是否存在标识符。如果不是,我将无法通过验证。 BC 取决于查找的值。

【问题讨论】:

  • 你到底想达到什么目的?你的要求是什么?
  • 有关系吗?
  • 伙计们,我已经编辑了这个问题。请参阅新部分Why do I need it?
  • 如果没有关于您的确切约束的详细信息,将很难给您一个 100% 准确的答案,因为有许多因素(例如,共享约束)可能会或可能不会修改订单它们被应用。我的建议是阅读 github (github.com/grails/grails-data-mapping) 上 org.grails.datastore.gorm.validation.constraints 包中的类的源代码并应用您的要求。一切都是平等的,如果你只是做基本的约束,那么答案是肯定的,它们按 A、B、C 的顺序应用。
  • 谢谢@JoshuaMoore,它很有帮助。我只是在验证基本约束。

标签: validation grails grails-3.0


【解决方案1】:

鉴于 Grails 本身不能保证顺序,并且可能会在版本之间发生变化,因此您对它的任何依赖充其量都是脆弱的。

这表明您处理问题的方式不正确。

鉴于您的字段 B 和 C 取决于 A 的情况,正确的解决方案是为 A 实施一个自定义验证器,该验证器考虑所有三个。

类似这样的:

a(validator: { val, obj, errors ->
  if (!val ...) { 
    errors.rejectValue('a', 'whatever.problem')
    return
  }
  if (!obj.b ...) { 
    errors.rejectValue('b', 'some.other.problem')
    return
  }
  if (!obj.c ...) { 
    errors.rejectValue('c', 'another.problem')
    return
  }
})

【讨论】:

  • 乔希,它仍然没有解决问题。 B 和 C 在 A 之前验证,但它们依赖于 A。我将验证和 A.validate()B.validate()C.validate() 分开。在这种情况下,Grails 方法对我来说似乎非常有限(以及其他情况;)。
  • 删除你在 B 和 C 上的其他验证,并将它们封装在 A 的验证中,以便它们可以独立完成(例如单个工作单元)。
  • 所以如果我的对象有字段 A、B 和 C,您建议只为 A 设置一个验证器并测试其他 2 个?
  • 如果 B 和 C 只应在 A 通过之后进行测试,那么,是的,这就是我的处理方式。在 A 上的一个自定义验证器中测试所有这些。您可以通过 errors 控制引发的错误以及拒绝哪个字段。
  • 乔希,我会接受答案,但我不同意将其他字段的验证提交给 A。如果对域的要求发生更改并且可能出现新字段,则可能会混淆顺序。然后我发现最好按照我的建议单独保留验证 - *.validate()。谢谢你的帮助。
猜你喜欢
  • 2011-06-07
  • 2014-04-26
  • 2012-10-28
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
相关资源
最近更新 更多