Grails自定义验证器,获取对字段名称的引用

时间:2013-01-02 11:22:49

标签: grails global shared customvalidator

我正在尝试为属性编写一个通用的自定义验证器,使其通用我需要在闭包内引用字段名,代码如下 在config.groovy

grails.gorm.default.constraints = {
nameShared(validator: {val, obj, errors->
        Pattern p = Pattern.compile("[a-zA-Z0-9-]{1,15}")
        Matcher m = p.matcher(val)
        boolean b = m.matches()
        if(!b)
        errors.rejectValue('name', "${obj.class}.name.invalid", "Name is invalid")

    })

在我的域类

class Student{
  String name

  static constraints = {
       name(shared:'nameShared')
   }
}

class Teacher{
  String firstName
  String lastName

  static constraints = {
     firstName(shared:'nameShared')
  }
}

我想对name和firstName使用相同的验证器,但由于我在验证器中对fieldName进行了硬编码,因此它总是适用于name而不是firstName,所以我想知道无论如何我都可以得到一个参考fieldname并使验证器通用,请帮助

2 个答案:

答案 0 :(得分:5)

您可以使用变量propertyName来获取已验证属性的名称。

来自grails docs

Closure还可以使用propertyName

访问约束适用的字段名称
myField validator: { val, obj -> return propertyName == "myField" }

答案 1 :(得分:0)

你可以将你的验证器封闭包装在另一个函数中:

def getValidator(myValue) {
  return { val, obj, errors ->
    // make use of myValue
  }
}

myField validator: getValidator('foo')