Les meilleures pratiques pour la validation en fonction des actions de Spring MVC
Je suis en train d'effectuer une validation à l'aide de Printemps de validation. Je me demande quelle est la meilleure pratique pour effectuer la validation qui dépend principalement de l'action de l'utilisateur, ci-après, j'ai trois approches différentes mais je ne sais pas lequel est le meilleur.
Assumer, nous avons les éléments suivants de la classe Foo afin de valider et de nombreuses règles de validation en fonction de l'action effectuée par l'utilisateur.
public class Foo {
private String name;
private int age;
private String description;
private int evaluation;
//getters, setters
}
Quel est le meilleur moyen pour effectuer ces validations (par exemple: lors de la création seul nom et l'âge sont nécessaires, au cours d'évaluer l'action, j'ai seulement besoin d'évaluation pour être validé et ainsi de suite)
solution 1: une classe de validation pour la validation de la règle
public class CreateFooValidator implements Validator {
//validation for action create
}
public class EvaluateFooValidator implements Validator {
//validation for evaluate action
}
solution 2: une classe de validation avec plusieurs méthodes
public class FooValidator implements Validator {
@Override
public boolean supports(Class<?> clazz) {
return Foo.class.equals(clazz);
}
//the default validate method will be used to validate during create action
@Override
public void validate(Object target, Errors errors) {
//validation required
}
//method to validate evaluate action
public void validateFooEvaluation(Object target, Errors errors) {
//validation required
}
//other validation methods for other actions
}
solution 3: propriété Supplémentaire d'action dans la classe Foo, un validateur
public class Foo {
private String name;
private int age;
private String description;
private int evaluation;
private String actionOnFoo;
//getters, setters
}
public class FooValidator implements Validator {
private final Foo foo = (Foo) target;
@Override
public boolean supports(Class<?> clazz) {
return Foo.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
//test which action is performed by user
if ("create".equals(foo.getActionOnFoo())) {
//call for private method that performs validation for create action
}
}
//all private methods
}
Quelle est la meilleure solution parmi les 3 ou une autre solution si tout?
Merci!
Vous devez vous connecter pour publier un commentaire.
Utilisation de la JSR-303 Groupes de Validation, qui sont depuis Spring MVC 3.1 également pris en charge par
@Validated
.Donc, pour chaque action, vous devez avoir une méthode dans votre contrôleur.
Créer un groupe de validation pour chaque action possible qui a un ensemble différent de règles, par exemple
Annoter
Foo
avec la validation des annotations, y compris le groupe, par exempleEnsuite annoter le
foo
argument de votre contrôleur de méthodes appropriées@Validated
annotation, par exemple@Validated({Evaluate.class})
pour laevaluate
la méthode du contrôleur.Vous trouverez un autre exemple ici (voir point 2):
http://blog.goyello.com/2011/12/16/enhancements-spring-mvc31/
Mise à jour:
Sinon, si pour quelque raison vous ne pouvez pas /ne souhaitez pas utiliser
@Validated
, vous pouvez utiliser l'injection d'uneValidator
instance et de passer les groupes de sonvalidate
méthode. C'est la façon dont il a été fait avant le Printemps 3.1 (comme c'est le cas dans l'article dans votre commentaire).Validator
. Mais cet article est pré-Printemps 3.1 je vais l'ajouter à la réponse.Dépend de ce que vous voulez faire. Toutes les solutions sont bonnes si vous l'appliquez à tous de votre validateurs de la même et vous souhaitez valider une partie de la logique métier, non seulement si elle est null ou pas (pour cela vous pouvez utiliser le @Valide et d'annotation l'annotation @not null pour les objets).
Pour moi, si j'ai un objet Foo je veux seulement un Validateur pour cet objet, et puis j'ai plusieurs méthodes pour valider les données dépend de j'ai besoin dans mon contrôleurs, par exemple, un enregistrement de nouveaux Foo ou autre pour validation avant la mise à jour, etc...