Question

Si une classe Java avec quelques champs que je veux valider par Hibernate Validator. Maintenant, je veux que mes utilisateurs d'être en mesure de configurer lors de l'exécution qui aura lieu validations.

Par exemple:

public class MyPojo {
    ...

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

    ...
}

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

Était-ce utile?

La solution

Vous ne pouvez pas le faire normalement.

Voici ce que je l'ai fait pour obtenir plus dynamiques de travail de validation via Hibernate Validator.

  1. Étendre la classe ClassValidator.
  2. Remplacer la méthode getInvalidVaues(Object myObj). Tout d'abord, appelez super.getInvalidValues(myObj), puis ajoutez le crochet à votre validation sur mesure.
  3. instancier validateur personnalisé et appeler getInvalidValues pour valider. Toute mise en veille prolongée annoté validation coup d'envoi à ce point, et les validateurs dynamiques personnalisés (quoi que ce soit pas pris en charge par les annotations) lanceront ainsi.

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 peut ne pas être en mesure de tirer parti du même code qui alimente les Validations mise en veille prolongée, mais de toute façon, ce que vous faites est plus impliqué que le cas d'utilisation « normale » pour validateur mise en veille prolongée.

Autres conseils

En fait, il est possible en veille prolongée validateur 4.1. Il suffit de lire la documentation sur le création de contrainte programatic .

Je ne pense pas que vous serez en mesure de supprimer ou modifier l'annotation, il fait partie de la définition de classe. Vous pouvez construire une nouvelle classe, ce qui est possible lors de l'exécution, mais un peu impliqué. Mise en veille prolongée peut favoriser l'accès programmatique aux validations et vous permettent de passer outre l'annotation, je ne sais pas l'API bien. Hibernate fait un peu de construction de classes d'exécution lui-même ... qui pourrait être un bon endroit pour apprendre comment le faire si vous êtes intéressé.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top