2013-01-02 69 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

是啊,這也有道理,但我一直在尋找一個默認的方式來訪問字段名,其中艾俄羅斯提到的,反正感謝您的幫助。 –