【问题标题】:Grails Validator Not Returning Expected MessageGrails 验证器未返回预期消息
【发布时间】:2015-03-09 18:09:11
【问题描述】:

我有一个在两个字段上进行大小验证的域对象。该对象基本上是这样的:

class foo {
    String name
    String description

    static constraints = {
        name nullable: false, blank: false, size: 3..31, validator { val, obj ->
            // additional data validation returning a code if it fails
        }
        description nullable: true, size: 3..255
    }
}

问题是我希望“默认”错误的形式为 class.field.error(例如,com.Foo.description.size.toosmall),但实际上,当域类生成代码,最终代码是“size.toosmall”,不是完全合格的版本。所以getCode用处不大。

代码列表是如何生成的,解决此问题的最佳方法是什么?我想过迭代所有代码并使用 messageSource 来查找它们,但这似乎非常疯狂和极端。让我感到困惑的是,我以前从未见过这个问题......让我觉得不知何故,正在发生一些不同的事情导致代码的奇怪顺序。还是我完全误解了它应该如何工作?

【问题讨论】:

  • 为什么您会认为非常具体的错误代码将是最后一个检查的错误代码,因为一旦在 message.properties 中找到具有翻译的错误代码就会停止?
  • 代码迭代了 allErrors 而不是 fieldErrors。我继承了它,但无法弄清楚为什么它没有(当错误传递给 messageSource 时)找出正确的代码。事实证明代码是错误的。我们没有让 gorm 做它的事情,而是手动做,通过更改为 fieldError,它能够遍历错误代码并选择正确的代码。

标签: validation grails


【解决方案1】:

好吧...发现不是遍历 allErrors 并尝试以这种方式提取代码,而是遍历 fieldErrors 并将整个 fieldError 传递给 messageSource,它会自行解决。

所以...

domainObject.errors.fieldErrors.each {
    someList << messageSource.getMessage(it, locale)
}

希望这对将来的其他人有所帮助。

【讨论】:

  • 这是首选方法。另见this answer
  • 好吧,无论如何,如果 someList 有其他东西进入它,否则你可以使用“收集”而不是每个,比如 someList = domainObject.errors.fieldErrors.collect { messageSource.getMessage(it, locale ) }
  • 我假设您在某处的非 GSP 页面中使用这些字符串?因为 grails 有标签库来显示已解决的 fieldErrors (grails.github.io/grails-doc/2.4.x/ref/Tags/hasErrors.html)。通过将它们转换为字符串(例如出现错误的字段名等),您正在使有关这些错误的信息更难访问。
  • 嗨,比尔,谢谢!使用 collect {} 绝对是正确的,我应该这样做...消息正在转换为 JSON 以响应 ajax 调用...
猜你喜欢
  • 2023-03-21
  • 2015-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 2020-06-01
  • 2015-11-20
相关资源
最近更新 更多