2

我正在尝试为属性编写一个通用的自定义验证器,为了使其通用,我需要在闭包中引用字段名称,代码如下在 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')
  }
}

我想对姓名和名字使用相同的验证器,但是由于我在验证器中对字段名进行硬编码,所以它始终适用于姓名而不是名字,所以我想知道是否有任何方法可以参考字段名并使验证器通用,请帮助

4

2 回答 2

6

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

来自 grails文档

闭包还可以访问约束应用于使用的字段的名称propertyName

myField validator: { val, obj -> return propertyName == "myField" }
于 2013-01-02T11:35:15.790 回答
0

您可以将验证器闭包包装在另一个函数中,如下所示:

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

myField validator: getValidator('foo')
于 2013-01-02T11:38:53.573 回答