2010-09-30 16 views
4

J'utilise la validation du bean JSR303 pour vérifier la saisie du formulaire.Comment définir l'ordre de vérification pour la validation du bean JSR303

@NotBlank 
@Size(min = 4, max = 30) 
private String name; 

@NotBlank 
@Size(max = 100) 
@Email 
private String mail; 

lorsque le nom puis = '' et email = '', le @NotBlank, @Size au nom, @NotBlank, @Size, @Email au courrier sera vérifié.

Je veux définir l'ordre de vérification, lorsque la commande précédente est invalide, la suivante n'est pas vérifiée, par exemple.

@NotBlank(order = 1) 
@Size(min = 4, max = 30, order = 2) 
private String name; 

(ci-dessus n'est pas supportée JSR303)

est-il possible de le mettre en œuvre pour l'utilisation JSR303? (je pense que l'annotation personnalisée sera faite, mais je n'aime pas ajouter une annotation personnalisée pour chaque propriété)

Et je considère également le groupe de validation et la séquence de groupe, mais je pense qu'il y a une différence pour mon besoin .

@NotBlank(groups = First.class) 
@Size(min = 4, max = 30, groups = Second.class) 
private String name; 

@NotBlank(groups = First.class) 
@Size(max = 100, groups = Second.class) 
@Email(groups = Third.class) 
private String mail; 

Lorsque le nom est vide et que le courrier est "abc". Seul le @NotBlank au nom, et @NotBlank au mail sera vérifié par JSR303, Parce que le @NotBlank au nom est invalide, donc les deuxième et troisième groupes ne sont pas vérifiés.

Mais mon besoin est @NotBlank au nom et @NotBlank, @Size, @Email at mail doit être vérifié. Parce que le @NotBlank au nom n'est pas valide, le @Size at name n'est pas vérifié, et le @ NotBlank, @ Size at mail est valide, donc le @Email at mail est vérifié. Peut-être, le pseudo-code ci-dessous sera clair pour décrire mon exigence.

// retrieves all fields and check one by one. 
for (Field field : fields) { 
    List annotations = getJsr303Annotations(field); 
    // retrieves all annotations on field and check one by one. 
    for (Annotation annotation : annotations) { 
    CheckResult result = check(annotation, field); 
    if (result.isValid()) { 
     continue; 
    } else { 
     errors.add(result); 
     break; 
    } 
    } 
} 

Existe-t-il un bon moyen de mettre en œuvre mon exigence par JSR303?

Répondre

6

Oui La validation du bean prend en charge cette fonctionnalité. C'est ce qu'on appelle des groupes de validation et des séquences de groupe. Les groupes sont des interfaces marqueurs simples, par exemple, vous pouvez créer les deux interfaces Première et deuxième et changer votre code à quelque chose comme ceci:

@NotBlank(groups = First.class) 
@Size(min = 4, max = 30, groups = Second.class) 
private String name; 

Ensuite, vous pouvez définir une séquence de groupe:

@GroupSequence({ First.class, Second.class}) 
interface All { 
} 

Procurez-vous de la Validator et appellent validator.validate (myObject, All.class)

Il est dans La documentation.

+1

Très merci pour votre réponse, la séquence de groupe ne répond pas à mes besoins, je modifie ma question. – eckelcn

1

Avez-vous envisagé de définir deux séquences. Un pour nom et un pour mail?

@GroupSequence({NameFirst.class, NameSecond.class}) 
interface AllName { 
} 

@GroupSequence({MailFirst.class, MailSecond.class, MailThird.class}) 
interface AllMail { 
} 

Dans ce cas, vous appelez le validateur comme ceci:

validator.validate(myObject, AllName.class, AllMail.class) 
2

L'ordre des annotations liées à la validation/contraintes ne peuvent pas être précisées au moment de la rédaction de cette réponse.J'ai soumis un problème lié à une commande à l'équipe Hibernate Validator il y a un certain temps, le problème a été accepté et sera probablement résolu dans une prochaine version de spécification Bean Validation - voir plus de détails ici: http://beanvalidation.org/proposals/BVAL-248/ Btw, dans des cas simples, vous pouvez éviter "en utilisant des combinaisons" non conflictuelles "d'annotations, par exemple NotNull et Size - La taille correspond à la valeur null.