Im folgenden Beispiel ist der ScriptFile
Parameter mit einer @Valid
Anmerkung gekennzeichnet.
Was macht @Valid
Annotation?
@RequestMapping(value = "/scriptfile", method = RequestMethod.POST)
public String create(@Valid ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {
if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");
if (result.hasErrors()) {
modelMap.addAttribute("scriptFile", scriptFile);
modelMap.addAttribute("showcases", ShowCase.findAllShowCases());
return "scriptfile/create";
}
scriptFile.persist();
return "redirect:/scriptfile/" + scriptFile.getId();
}
quelle
@Valid
aufApplicationForm
Parameter aber noch wurde Validierungen beschossendate
(Set alsnull
) Feld. Bitte erkläre.IIRC @Valid ist keine Spring-Annotation, sondern eine JSR-303-Annotation (dies ist der Bean-Validierungsstandard). Grundsätzlich wird geprüft, ob die Daten, die Sie an die Methode senden, gültig sind oder nicht (die scriptFile wird für Sie validiert).
quelle
@Valid
an sich hat nichts mit Frühling zu tun. Es ist Teil der Bean Validation-Spezifikation (es gibt mehrere davon, die letzte ist JSR 380 ab der zweiten Jahreshälfte 2017),@Valid
ist jedoch sehr alt und leitet sich vollständig von JSR 303 ab.Wie wir alle wissen, ist Spring sehr gut darin, die Integration in alle verschiedenen JSRs und Java-Bibliotheken im Allgemeinen (denken Sie an JPA, JTA, Caching usw.) bereitzustellen, und natürlich haben sich diese Leute auch um die Validierung gekümmert. Eine der Schlüsselkomponenten, die dies erleichtert, ist MethodValidationPostProcessor .
Der Versuch, Ihre Frage zu beantworten,
@Valid
ist sehr praktisch für die sogenannte Validierungskaskadierung, wenn Sie ein komplexes Diagramm und nicht nur Elemente eines Objekts der obersten Ebene validieren möchten. Jedes Mal, wenn Sie tiefer gehen möchten, müssen Sie verwenden@Valid
. Das schreibt JSR vor. Spring wird dem mit einigen geringfügigen Abweichungen entsprechen (zum Beispiel habe ich versucht,@Validated
anstelle der@Valid
RestController-Methode zu setzen, und die Validierung funktioniert, aber das Gleiche gilt nicht für reguläre "Service" -Beans).quelle
ScriptFile scriptFile
.public String create(@Valid @NotNull ScriptFile scriptFile, BindingResult result, ModelMap modelMap) { if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");
Ich denke, diese
@NotNull
Anmerkung ist daher gültig, wenn keine Bedingung benötigt wird.quelle
Nur zur Ergänzung der oben Antwort, in einer Web - Anwendung
@valid
wird verwendet , wenn die Bohne validiert werden soll , wird auch bei der Validierung kommentierten Anmerkungen zum Beispiel@NotNull
,@Email
(Hibernate Annotations) so , wenn während Eingabe von Benutzer immer die Werte validiert werden kann und verbindliche Ergebnis der Validierung wird Ergebnisse.bindingResult.hasErrors()
wird feststellen, ob eine Validierung fehlgeschlagen ist.quelle
Ein weiterer praktischer Aspekt von @Valid, der oben nicht erwähnt wurde, ist, dass @Valid (dh Verwenden von Postman zum Testen eines Endpunkts) die Ausgabe eines falschen REST-Aufrufs in formatierten JSON anstelle eines Blobs aus kaum lesbarem Text formatiert. Dies ist sehr nützlich, wenn Sie eine kommerziell konsumierbare API für Ihre Benutzer erstellen.
quelle
Ich glaube, ich weiß, wohin Ihre Frage führt. Und da diese Frage in den Suchergebnissen von Google auftaucht, kann ich eine einfache Antwort darauf geben, was die Annotation @Valid bewirkt.
Ich werde 3 Szenarien vorstellen, wie ich @Valid verwendet habe
Modell:
public class Employee{ private String name; @NotNull(message="cannot be null") @Size(min=1, message="cannot be blank") private String lastName; //Getters and Setters for both fields. //... }
JSP:
... <form:form action="processForm" modelAttribute="employee"> <form:input type="text" path="name"/> <br> <form:input type="text" path="lastName"/> <form:errors path="lastName"/> <input type="submit" value="Submit"/> </form:form> ...
Controller für Szenario 1:
@RequestMapping("processForm") public String processFormData(@Valid @ModelAttribute("employee") Employee employee){ return "employee-confirmation-page"; }
In diesem Szenario wird nach dem Absenden Ihres Formulars mit einem leeren Feld für den Nachnamen eine Fehlerseite angezeigt, da Sie Validierungsregeln anwenden, diese jedoch überhaupt nicht verarbeiten.
Beispiel für diesen Fehler: Ausnahmeseite
Controller für Szenario 2:
@RequestMapping("processForm") public String processFormData(@Valid @ModelAttribute("employee") Employee employee, BindingResult bindingResult){ return bindingResult.hasErrors() ? "employee-form" : "employee-confirmation-page"; }
In diesem Szenario übergeben Sie alle Ergebnisse dieser Validierung an das BindingResult. Es liegt also an Ihnen, zu entscheiden, was mit den Validierungsergebnissen dieses Formulars geschehen soll.
Controller für Szenario 3:
@RequestMapping("processForm") public String processFormData(@Valid @ModelAttribute("employee") Employee employee){ return "employee-confirmation-page"; } @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public Map<String, String> invalidFormProcessor(MethodArgumentNotValidException ex){ //Your mapping of the errors...etc }
In diesem Szenario behandeln Sie die Fehler immer noch nicht wie im ersten Szenario, sondern übergeben sie an eine andere Methode, die die Ausnahme berücksichtigt , die @Valid bei der Verarbeitung des Formularmodells auslöst. Überprüfen Sie dies, um zu sehen, was mit dem Mapping und all dem zu tun ist.
Um es zusammenzufassen : @Valid auf seine eigene mit nichts mehr tun , dass Auslöser der Validierung Validierung JSR 303 kommentierten Felder ( @NotNull, @Email, @size, etc ... ), müssen Sie noch eine Strategie bestimmen , was zu tun mit den Ergebnissen dieser Validierung.
Ich hoffe, ich konnte etwas für Leute klären, die darüber stolpern könnten.
quelle