Champ de variable dans une annotation de contrainte
J'ai besoin de créer un personnalisé contrainte d'annotation qui peut accéder à la valeur d'un autre champ de mon haricot. Je vais utiliser cette annotation pour valider le champ, car il dépend de la valeur de l'autre, mais la façon dont je le définir le compilateur dit "La valeur de l'annotation attribut" de mon domaine "doit être une expression constante".
J'ai définies dans cette voie:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy=EqualsFieldValidator.class)
@Documented
public @interface EqualsField {
public String field();
String message() default "{com.myCom.annotations.EqualsField.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
public class EqualsFieldValidator implements ConstraintValidator<EqualsField, String>{
private EqualsField equalsField;
@Override
public void initialize(EqualsField equalsField) {
this.equalsField = equalsField;
}
@Override
public boolean isValid(String thisField, ConstraintValidatorContext arg1) {
//my validation
}
}
et dans mon haricot je veux quelque chose comme ceci:
public class MyBean{
private String field1;
@EqualsField(field=field1)
private String field2;
}
Est-il possible de définir l'annotation de sorte que la valeur du champ peut être une variable?
Grâce
source d'informationauteur Javi
Vous devez vous connecter pour publier un commentaire.
La meilleure chose à faire est de prendre un pas en arrière: la contrainte/validator vous avez écrit des œuvres sur un terrain de niveau, mais ce que vous voulez faire respecter est un champ de croisement de dépendance c'est à dire un niveau de classe de contrainte.
De réécrire votre contrainte et le validateur de travailler au niveau de la classe (c'est à dire l'annotation va aller sur la classe, et non pas sur le terrain). De cette façon, vous aurez accès à l'ensemble de la classe. Dans votre isValid(..) la méthode, il suffit de faire un get sur les deux champs, de comparer, et de retour de façon appropriée.
Que le compilateur dit les annotations doivent être constante (c'est à dire que vous pouvez déterminer la valeur au moment de la compilation.) Maintenant, Si je devine bien, il semble que vous utilisez cette annotation pour indiquer que les valeurs de ces champs doit être égal quand courir à travers le champ est égal à validateur. Une approche que l'on pourrait prendre, c'est à l'aide de la réflexion. Au lieu d'essayer de les annoter avec la valeur, de les annoter avec le nom du champ à la place
Puis dans votre programme de validation, vous pouvez lire le nom du champ et utiliser la réflexion pour y accéder
En fonction de ce que vous essayez de le faire vous devrez peut-être ajouter dans la logique basée sur le type de champ, mais toujours le même principe général.
Découvrez cette question précédente, a de multiples solutions pour le cross-validation de champ: Croix de validation sur le terrain avec Hibernate Validator (JSR 303)