2013-01-02 2 views
1

J'essaie d'écrire un validateur générique personnalisé pour une propriété, pour le rendre générique j'ai besoin d'une référence au nom du champ dans la fermeture, le code est comme suit config.groovyValidateur personnalisé Grails, obtenant une référence au nom du champ

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") 

    }) 

dans ma classe de domaine

class Student{ 
    String name 

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

class Teacher{ 
    String firstName 
    String lastName 

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

Je veux utiliser le même validateur pour le nom et prenom, mais depuis que je suis le hardcoding fieldName dans le validateur, il sera toujours travailler pour nom et non prénom, donc je veux savoir s'il y a de toute façon je peux obtenir une référence au nom de champ et rendre le validateur générique, s'il vous plaît aider

Répondre

4

Vous pouvez utiliser la variable propertyName pour obtenir le nom de la propriété validée.

Des Grails docs:

La fermeture a également accès au nom du champ que la contrainte s'applique à l'utilisation propertyName

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

woah, comment puis-je manquer ça? merci aiolos –

0

Vous pouvez envelopper votre validateur fermeture dans une autre fonction comme ceci:

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

myField validator: getValidator('foo') 
+0

ouais, cela a aussi du sens, mais je cherchais un moyen par défaut pour accéder au nom de domaine, qui aiolos mentionné, de toute façon merci pour votre aide. –

Questions connexes