2009-04-15 9 views
3

Si j'ai une classe Java avec certains champs, je veux valider en utilisant Hibernate Validator. Maintenant, je veux que mes utilisateurs puissent configurer à l'exécution quelles validations ont lieu.Comment puis-je modifier les annotations/règles de validation Hibernate lors de l'exécution?

Par exemple:

public class MyPojo { 
    ... 

    @NotEmpty 
    String void getMyField() { 
     ... 
    } 

    ... 
} 

Disons que je veux supprimer le chèque NotEmpty ou la remplacer par Email ou CreditCardNumber, comment puis-je le faire? Est-ce même possible? Je suppose que cela revient à changer les annotations à l'exécution ...

Répondre

2

Vous ne pouvez pas le faire normalement.

Voici ce que j'ai fait pour obtenir des validations plus dynamiques en utilisant Hibernate Validator.

  1. Étendez la classe ClassValidator. Remplacez la méthode getInvalidVaues(Object myObj) par
  2. . D'abord, appelez super.getInvalidValues(myObj), puis ajoutez le crochet à votre validation personnalisée.
  3. Instancier votre validateur personnalisé et appeler le getInvalidValues pour le valider. Toutes les validations annotées d'hibernation démarreront à ce stade, et vos validations dynamiques personnalisées (tout ce qui n'est pas pris en charge par les annotations) démarreront également.

Exemple:

public class MyObjectValidator extends ClassValidator<MyObject> 
{ 
    public MyObjectValidator() 
    { 
     super(MyObject.class); 
    } 

    public InvalidValue[] getInvalidValues(MyObject myObj) 
    { 
     List<InvalidValue> invalids = new ArrayList<InvalidValue>(); 
     invalids.addAll(Arrays.asList(super.getInvalidValues(myObj))); 

     // add custom validations here 
     invalids.addAll(validateDynamicStuff(myObj)); 

     InvalidValue[] results = new InvalidValue[invalids.size()]; 
     return invalids.toArray(results); 
    } 

    private List<InvalidValue> validateDynamicStuff(MyObject myObj) 
    { 
     // ... whatever validations you want ... 
    } 

} 

Ainsi, votre code de validation personnalisé peut contenir une logique comme « Do cette validation, si l'utilisateur configuré, sinon faire un », etc. Vous pouvez ou ne pas être en mesure pour tirer parti du même code qui alimente les validations d'hibernation, mais de toute façon, ce que vous faites est plus impliqué que le cas d'utilisation «normal» pour le validateur d'hibernation.

0

Je ne pense pas que vous serez en mesure de supprimer ou de modifier l'annotation, cela fait partie de la définition de la classe. Vous pouvez créer une nouvelle classe, ce qui est possible lors de l'exécution mais un peu impliqué. Hibernate peut prendre en charge l'accès programmé aux validations et vous permettre de remplacer l'annotation, je ne connais pas très bien l'API. Hibernate fait un peu de classe d'exécution en se construisant lui-même ... cela pourrait être un bon endroit pour apprendre à le faire si vous êtes intéressé.

+0

Remplacement de l'annotation _wont_ work. Une façon de personnaliser Hibernate Validator est d'écrire vos propres annotations, mais cela ne fonctionnera pas pour ce que DR essaie de faire, car vous n'avez pas accès aux valeurs dynamiques à l'exécution, sauf pour le champ où l'annotation est attaché à. Toutes les entrées dans l'annotation pour le configurer doivent être des constantes. Pour quelque chose qui fonctionne, consultez ma réponse ci-dessous. –

Questions connexes