2013-01-02 31 views
1

我想为属性编写一个通用自定义验证器,使其通用我需要对封闭内的字段名称进行引用,代码如下 In Config.groovy中Grails自定义验证器,获取对字段名称的引用

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') 
    } 
} 

我想用两个名称和firstName相同的验证,但因为我在验证硬编码字段名,它总是工作名字而不是名字,所以我想知道如果无论如何,我可以得到一个字段名称的参考,并使验证器通用,请帮助

回答

4

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

从Grails的docs

闭包也可以访问该约束适用于使用propertyName

myField validator: { val, obj -> return propertyName == "myField" } 
+0

哇,我怎么会想念那个?感谢艾俄罗斯 –

0

的字段的名称,您可以换另一个函数内部验证闭合像这样:

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

myField validator: getValidator('foo') 
+0

是啊,这也有道理,但我一直在寻找一个默认的方式来访问字段名,其中艾俄罗斯提到的,反正感谢您的帮助。 –