如何在 Grails 3.3 中自定义错误消息?

How to customize error messages in Grails 3.3?

在 GRAILS 中,可以在 i18n/messages.properties 中定义通用错误

default.invalid.validator.message=Property [{0}] of class [{1}] with value [{2}] does not pass custom validation

使用 GSP 文件中的 hasErrors 方法,错误显示如下

Property [eyeColor] of [class org.application.PersonData] with value [brown] does not pass custom validation

是否可以在任何地方定义“属性”和“class”名称的翻译,以便可以友好地显示错误?像

Property [eye color] of [user] with value [brown] does not pass custom validation

类似于 i18n/messages.properties 文件中的设置

org.application.PersonData=user
org.application.PersonData.eyeColor=eye color

Is it possible to define anywhere a translation for "property" and "class" name so error can be shown in a frienly? something like

是的。您可以根据需要制作错误消息。

https://github.com/jeffbrown/geblini18nmessages 查看项目。

https://github.com/jeffbrown/geblini18nmessages/blob/94ac5402782e4dbf10f3822cecf6857ba7451096/grails-app/domain/geblini18nmessages/PersonData.groovy

package geblini18nmessages

class PersonData {
    String name
    String eyeColor
    static constraints = {
        eyeColor validator: { val ->
            // valid
            if(val in ['blue', 'green', 'brown']) return true

            // invalid
            return ['personData.eye.color.invalid', val]
        }
    }
}

https://github.com/jeffbrown/geblini18nmessages/blob/94ac5402782e4dbf10f3822cecf6857ba7451096/grails-app/i18n/geblin.properties

personData.eye.color.invalid=Eye color with value [{2}] does not pass custom validation

当验证失败时,该自定义验证器返回 ListList 中的第一个元素表示将用于查找验证错误消息的消息键。 List 中的每个后续元素都可以是您想要放入消息中的任意值。在消息中,您可以使用 {2}{3} 等变量替换为 List 中的值。 {0} 是正在验证的 属性 的名称。 {1} 是域名 class。 {2} 以及上面的每个后续索引都将对应于您在消息代码后 List 中输入的值。

您显示的消息 ("Property [eye color] of [user] with value [brown] does not pass custom validation") 可以通过这样定义 属性 来实现:

personData.eye.color.invalid=Property [eye color] of [user] with value [{2}] does not pass custom validation.

在这种情况下使用 "eye color""user" 的参数没有意义,因为错误消息仅用于特定域中的特定 属性。

更多信息请见 https://docs.grails.org/4.0.5/ref/Constraints/validator.html