Best practices für die Validierung je nach Aktionen, Spring MVC
Ich versuche, um die Validierung mit Spring-Validierung. Ich Frage mich, was ist die beste Vorgehensweise, um die Validierung, dass kommt vor allem auf die Aktionen des Anwenders, im folgenden habe ich drei verschiedene Ansätze, aber ich weiß nicht welche am besten ist.
Angenommen, wir haben folgende Klasse Foo zu validieren und viele andere Regeln der validation je nach Aktion durch den Benutzer.
public class Foo {
private String name;
private int age;
private String description;
private int evaluation;
//getters, setters
}
Was ist der beste Weg, durchführen diese Validierungen (zum Beispiel: während der Erstellung nur name und Alter erforderlich sind, während der Bewertung einer Maßnahme, brauche ich nur die Bewertung validiert werden und so weiter)
Lösung 1: eine validator-Klasse pro Gültigkeitsregel
public class CreateFooValidator implements Validator {
//validation for action create
}
public class EvaluateFooValidator implements Validator {
//validation for evaluate action
}
Lösung 2: eine validator-Klasse mit mehreren Methoden
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
}
Lösung 3: Zusätzliche Eigenschaft Aktion in der Klasse Foo, eine Prüfung
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
}
Was ist die beste Lösung unter den 3 oder andere Lösung, wenn überhaupt?
Danke!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden JSR-303 Validation Gruppen, die da sind, Spring MVC 3.1 unterstützt auch
@Validated
.So, für jede Aktion, die Sie haben sollte eine Methode im controller.
Erstellen Sie eine Prüfgruppe für jede mögliche Aktion, die einen anderen Satz von Regeln, z.B.
Kommentieren
Foo
mit der validation-Annotationen mit der Gruppe, z.B.Dann kommentieren die
foo
argument des controller-Methoden mit den entsprechenden@Validated
annotation, z.B.@Validated({Evaluate.class})
für dieevaluate
controller-Methode.Finden Sie ein weiteres Beispiel hier (unter Punkt 2):
http://blog.goyello.com/2011/12/16/enhancements-spring-mvc31/
Update:
Alternativ, wenn aus irgendeinem Grund Sie können 'T /don' T verwenden möchten
@Validated
, können Sie mit einem injiziertenValidator
- Instanz, und übergeben Sie die Gruppen auf seinevalidate
Methode. Das ist die Art und Weise es gemacht wurde, bevor im Frühjahr 3.1 (wie es der Fall im Artikel auf deinen Kommentar).Validator
. Aber dieser Artikel ist pre-Spring 3.1, werde ich dies zur Antwort.Hängt davon ab, was Sie wollen, es zu tun. Alle Lösungen sind gut, wenn Sie gelten in allen Prüfungen die gleichen sind und Sie überprüfen möchten einige business-Logik, nicht nur wenn es null ist oder nicht (für diesen Zweck können Sie die @Valid-annotation und der annotation @not null in den Objekten).
Für mich, wenn ich ein Objekt Foo ich will nur eine Prüfung für dieses Objekt, und dann habe ich mehrere Methoden für die Validierung der Daten hängt von brauche ich in meinem Controller, zum Beispiel eine für das neue Foo oder andere, für die überprüfung vor dem Update, etc...