Vous ne pouvez pas le faire normalement.
Voici ce que j'ai fait pour obtenir des validations plus dynamiques en utilisant Hibernate Validator.
- Étendez la classe
ClassValidator
. Remplacez la méthode getInvalidVaues(Object myObj)
par
- . D'abord, appelez
super.getInvalidValues(myObj)
, puis ajoutez le crochet à votre validation personnalisée.
- 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.
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. –