默认验证器上的自定义验证消息

时间:2014-09-19 11:11:29

标签: grails grails-2.0 grails-plugin

假设我有一些带有默认验证器的域类:

    class Employee {

        String name
        String primaryEmail
        String url

        static constraints = {
            name blank: false
            primaryEmail email: true, unique: true
            url blank: false, url: true

        }

    }

我想定义在验证失败时应该返回的消息的名称,如下所示:

    class Employee {

        String name
        String primaryEmail
        String url

        static constraints = {
            name blank: false 'employee.invalid.name'
            primaryEmail email: true, unique: true
            url blank: false, url: true 'employee.invalid.email' 

        }

    }

有可能吗?谢谢!

2 个答案:

答案 0 :(得分:1)

定义自己的自定义消息实际上非常简单。但是,您的方法不正确。

首先,查看validation reference以了解验证消息代码的构建方式。

使用您的示例,您的一些自定义消息将是:

employee.name.blank=Custom message about invalid employee due to blank
employee.url.blank=Another custom message about blank url
employee.url.url.invalid=Custom invalid url message

消息是每种约束类型,因此每个属性都有一条全局消息不起作用。您需要为每个可能失败的约束提供消息。

答案 1 :(得分:1)

您可以通过定义自定义验证程序来完成此操作。它基本上是一个最多需要三个参数的闭包。所以在你的例子中你可以写:

class Employee {

    String name
    String primaryEmail
    String url

    static constraints = {
        name validator: {
            if (!it) return ['employee.invalid.name']
        }
        primaryEmail email: true, unique: true
        url validator: {
            if (!it) return ['employee.invalid.email']
        }
    }

}

关于自定义验证器闭包的注意事项:如果没有提供参数,则可以使用隐式变量访问该属性的值:

validator: {
   if (!it) ...
}

如果你提供两个参数,那么第一个参数是属性值,第二个是被验证的域类实例(例如,你可以检查其他参数)

validator: {val, obj ->
  if (val && obj.otherProp){...}
}

如果你提供三个参数,那么前两个与两个参数版本相同,第三个是Spring 错误对象:

validator: {val, obj, err ->
  if (val && obj.otherProp){...}
}

有关详细说明,请查看文档: http://grails.org/doc/latest/ref/Constraints/validator.html