2010-11-28 13 views
0

Dans une classe de domaine j'ai une valeur d'un ENUM qui représente une adresse e-mail ou une URLValidator pour plusieurs types de Grails

class Contact{ 
    ContactType contact 
    String value 
} 

enum ContactType{ 
    EMAIL, 
    URL 
} 

Je suis en train d'utiliser le construit dans Grails cours EmailConstraint et UrlConstraint à valider:

static constraints = { 
    value(validator: { 
    ContactType.validate(obj, val, errors) 
    }) 
} 

J'ai réussi à le faire fonctionner en faisant quelques hypothèses de lecture source de Grails:

Constraint constraint = new EmailConstraint() 
constraint.setPropertyName "value" 
constraint.setOwningClass obj.class 
constraint.setParameter true 
constraint.validate(obj, obj.value, errors) 

Mais je trouve cela très moche, donc je me demandais si quelqu'un peut offrir une meilleure solution.

Merci.

Répondre

0

Vous pouvez implémenter une contrainte personnalisée pour ce cas en utilisant http://www.grails.org/plugin/constraints. La nouvelle classe de contraintes peut déléguer en interne à EmailConstraint ou à une sorte de "URLConstraint" en fonction de la valeur enum.

En utilisant cette approche, votre classe de domaine reste propre une petite, les détails de validation sont séparés dans une classe différente.

+0

Bonne idée, merci, mais encore, le code de la contrainte ne cesse de me déranger. – Eldelshell

+0

vous pourriez 'groovyfy' le code ci-dessus à: new EmailConstraint (propertyName: 'value', owningClass: obj.class, paramater: true) .validate (obj, obj.value, erreurs) –