2013-01-08 4 views
1

Nous utilisons @Min, @Max, @NotNull etc annotations pour les validations côté serveur au printemps MVC.Thses annotations devraient être place dans Model Class.suppose je veux appliquer de telles annotations en cas de besoin, je ne veux pas appliquer ces annotations dans la classe Model.Validators in Spring MVC

Par exemple.

J'ai une classe Personne avec les propriétés Nom, Sexe, Email. Si je mets @NotNull annotation sur la propriété e-mail alors il sera appliqué globalement, si mon requirment est changé comme si dans mon système il y a deux personnes Student et Teacher et pour Teacher registration email est facultatif mais pour Student son non null alors comment Je réalise ceci.

peut i appliquer des annotations de validation dynamiclly en cas de ci-dessus exemple-

Si UserRegistration est pour l'enseignant Ensuite Email est facultatif.

Si UserRegistration est pour l'étudiant alors l'email est obligatoire.

Répondre

1

Vous devrez implémenter votre propre validateur et l'enregistrer dans votre contrôleur.

+0

Oui, cela peut être une option et je pense à ce sujet aussi, mais ma question est sur les annotations prédéfinies.Merci pour votre réponse :) – Amogh

0

Ceci est l'un des problèmes qui sont présentés en utilisant la validation du bean. le fait qu'ils sont en fait appliqués mondialement.

Un problème courant est la mise à jour d'une entité dont la date est précédée d'une annotation @before ore @after entraînant une mise à jour non valide, ce qui est difficile à vérifier. Une manière courante de résoudre ce problème consiste à utiliser des objets DTO ou de transfert de données, au lieu d'accepter directement les objets de modèle dans votre contrôleur, vous créez une classe spécifique pour cette action (que vous pouvez réutiliser dans d'autres actions. peut également déconnecter votre modèle de ce que fait votre logiciel, et c'est plus sécurisé, car le ressort lie juste tout ce que vous lui lancez.Par exemple si un objet utilisateur a un drapeau d'admin, si ce drapeau admin est posté et mis à vrai, sera tout simplement remplir volontiers dans votre modèle objet. est vous aide DTO pouvez simplement copier les champs dont vous avez besoin et ignorer le reste.

+0

Je n'ai pas eu ce que vous voulez dire. – Amogh

+0

Fondamentalement, vous créez plusieurs classes avec plus ou moins les mêmes champs, mais des annotations de validation différentes. Cependant, la solution de Slava Semushin semble mieux –

5

pour ce comportement, je suggère d'utiliser des groupes avec l'activation de façon dynamique. Regardez mon exemple ci-dessous.

Person.java:

class Person { 

    @NotNull(groups = StudentChecks.class) 
    @Email 
    private email; 

    // other members with getters/setters 

    public interface StudentChecks { 
    } 
} 

Dans ce cas @NotNull contrainte ne seront exécutés que lorsque le groupe StudentChecks est activé. Pour activer le groupe de validation par condition Spring propose une annotation spéciale @Validated.

StudentController.java:

@Controller 
public class StudentController { 

    @RequestMapping(value = "/students", method = RequestMethod.POST) 
    public String createStudent(@Validated({Person.StudentChecks.class}) Person student, BindingResult result) { 
     // your code 
    } 

} 

Plus de détails vous pouvez y trouver: