Mit Spring MVC gibt es drei verschiedene Möglichkeiten, eine Validierung durchzuführen: manuelle Verwendung von Anmerkungen oder eine Mischung aus beiden. Es gibt keinen eindeutigen "saubersten und besten Weg" zur Validierung, aber es gibt wahrscheinlich einen, der besser zu Ihrem Projekt / Problem / Kontext passt.
Lassen Sie uns einen Benutzer haben:
public class User {
private String name;
...
}
Methode 1: Wenn Sie Spring 3.x + und eine einfache Validierung durchführen müssen, verwenden Sie javax.validation.constraints
Anmerkungen (auch als JSR-303-Anmerkungen bezeichnet).
public class User {
@NotNull
private String name;
...
}
Sie benötigen einen JSR-303-Anbieter in Ihren Bibliotheken, z. B. Hibernate Validator, der die Referenzimplementierung darstellt (diese Bibliothek hat nichts mit Datenbanken und relationaler Zuordnung zu tun, sondern führt nur eine Validierung durch :-).
Dann hätten Sie in Ihrem Controller so etwas wie:
@RequestMapping(value="/user", method=RequestMethod.POST)
public createUser(Model model, @Valid @ModelAttribute("user") User user, BindingResult result){
if (result.hasErrors()){
// do something
}
else {
// do something else
}
}
Beachten Sie das @Valid: Wenn der Benutzer zufällig einen Nullnamen hat, ist result.hasErrors () wahr.
Methode 2: Wenn Sie über eine komplexe Validierung verfügen (z. B. Validierungslogik für große Unternehmen, bedingte Validierung über mehrere Felder usw.) oder aus irgendeinem Grund Methode 1 nicht verwenden können, verwenden Sie die manuelle Validierung. Es wird empfohlen, den Code des Controllers von der Validierungslogik zu trennen. Erstellen Sie Ihre Validierungsklasse (n) nicht von Grund auf neu, Spring bietet eine praktische org.springframework.validation.Validator
Oberfläche (seit Spring 2).
Nehmen wir an, Sie haben
public class User {
private String name;
private Integer birthYear;
private User responsibleUser;
...
}
und Sie möchten eine "komplexe" Validierung durchführen, z. B.: Wenn das Alter des Benutzers unter 18 Jahren liegt, darf der verantwortliche Benutzer nicht null und das Alter des verantwortlichen Benutzers über 21 Jahre sein.
Sie werden so etwas tun
public class UserValidator implements Validator {
@Override
public boolean supports(Class clazz) {
return User.class.equals(clazz);
}
@Override
public void validate(Object target, Errors errors) {
User user = (User) target;
if(user.getName() == null) {
errors.rejectValue("name", "your_error_code");
}
// do "complex" validation here
}
}
Dann hätten Sie in Ihrem Controller:
@RequestMapping(value="/user", method=RequestMethod.POST)
public createUser(Model model, @ModelAttribute("user") User user, BindingResult result){
UserValidator userValidator = new UserValidator();
userValidator.validate(user, result);
if (result.hasErrors()){
// do something
}
else {
// do something else
}
}
Wenn Validierungsfehler vorliegen, ist result.hasErrors () wahr.
Hinweis: Sie können den Validator auch in einer @ InstBinder-Methode des Controllers mit "binder.setValidator (...)" festlegen (in diesem Fall wäre eine gemischte Verwendung der Methoden 1 und 2 nicht möglich, da Sie die Standardeinstellung ersetzen Validator). Oder Sie können es im Standardkonstruktor des Controllers instanziieren. Oder haben Sie einen @ Component / @ Service UserValidator, den Sie in Ihren Controller einfügen (@Autowired): sehr nützlich, da die meisten Validatoren Singletons sind + das Verspotten von Unit-Tests einfacher wird + Ihr Validator andere Spring-Komponenten aufrufen könnte.
Methode 3:
Warum nicht eine Kombination beider Methoden verwenden? Überprüfen Sie die einfachen Dinge wie das Attribut "name" mit Anmerkungen (schnell, präzise und besser lesbar). Behalten Sie die umfangreichen Validierungen für Validatoren bei (wenn es Stunden dauern würde, benutzerdefinierte komplexe Validierungsanmerkungen zu codieren, oder wenn es nicht möglich ist, Anmerkungen zu verwenden). Ich habe das bei einem früheren Projekt gemacht, es hat wie ein Zauber funktioniert, schnell und einfach.
Achtung: Sie müssen Fehler Validierung Handhabung für die Ausnahmebehandlung . Lesen Sie diesen Beitrag, um zu erfahren, wann Sie sie verwenden müssen.
Verweise :