假设我有一些带有默认验证器的域类:
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'
}
}
有可能吗?谢谢!
答案 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