it-swarm.com.de

Was zeigt die Annotation @Valid in Spring?

Im folgenden Beispiel ist der Parameter ScriptFile mit einer @Valid-Annotation markiert.

Was macht die @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();        
}    
58
Gary Ford

Es ist zu Validierungszwecken.

Validierung Es ist üblich, eine .__ zu validieren. Modell nach Bindung der Benutzereingabe daran . Frühling 3 bietet Unterstützung für deklarative Validierung mit JSR-303 . Diese Unterstützung wird automatisch aktiviert wenn ein JSR-303-Provider wie Hibernate Validator, ist auf .__ vorhanden. dein Klassenpfad Wenn aktiviert, können Sie Validierung einfach durch .__ auslösen. Kommentieren einer Controller-Methode Parameter mit der Annotation @Valid: Nach dem Binden eingehender POST Parameter wird die AppointmentForm validiert werden; in diesem Fall zur Überprüfung von Der Datumsfeldwert ist nicht null und tritt in der Zukunft auf.


Hier finden Sie weitere Informationen:
http://blog.springsource.com/2009/11/17/spring-3-type-conversion-and-validation/

42
mhshams

Wenn Sie die obigen Antworten hinzufügen, werfen Sie einen Blick auf Folgendes. Die AppointmentForm-Spalte von date wird mit einigen Annotationen versehen. Durch eine @Valid-Annotation, die Validierungen für die AppointmentForm (in diesem Fall @NotNull und @Future) auslöst. Diese Anmerkungen könnten von verschiedenen JSR-303-Providern stammen (z. B. Hibernate, Spring ... etc).

    @RequestMapping(value = "/appointments", method = RequestMethod.POST)
    public String add(@Valid AppointmentForm form, BindingResult result) {
        ....
    }

    static class AppointmentForm {

        @NotNull @Future
        private Date date;
    }
21
Charith

IIRC @Valid ist keine Spring-Annotation, sondern eine JSR-303-Annotation (dies ist der Bean-Validierungsstandard). Im Prinzip wird geprüft, ob die Daten, die Sie an die Methode senden, gültig sind oder nicht (die Skriptdatei wird für Sie validiert).

12
Mateusz Dymczyk

@Valid an sich hat nichts mit Spring zu tun. Es ist Teil der Bean-Validierungsspezifikation (es gibt mehrere von ihnen, der letzte ist JSR 380 ab der zweiten Hälfte von 2017), aber @Valid ist sehr alt und stammt von JSR 303.

Wie wir alle wissen, ist Spring sehr gut darin, die Integration mit allen verschiedenen JSRs und Java-Bibliotheken im Allgemeinen zu ermöglichen (denken Sie an JPA, JTA, Caching usw.), und natürlich haben sich diese Leute auch um die Validierung gekümmert. Eine der Schlüsselkomponenten, die dies ermöglicht, ist MethodValidationPostProcessor .

Der Versuch, Ihre Frage zu beantworten - @Valid ist sehr praktisch für die sogenannte Validierungskaskadierung, wenn Sie einen komplexen Graphen und nicht nur Elemente eines Objekts auf oberster Ebene validieren möchten. Jedes Mal, wenn Sie tiefer gehen möchten, müssen Sie @Valid verwenden. Das schreibt JSR vor. Spring wird dies mit einigen geringfügigen Abweichungen einhalten (z. B. habe ich versucht, @Validated anstelle von @Valid auf die RestController-Methode zu setzen und die Validierung funktioniert, aber dasselbe gilt nicht für reguläre "Service" -Beans).

10
yuranos87
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 gültig, wenn die Bedingung nicht benötigt wird.

2
mzlobecki

Zur obigen Antwort wird lediglich Folgendes hinzugefügt: In einer Webanwendung wird __.@valid verwendet, wenn das zu validierende Bean ebenfalls mit Validierungsanmerkungen versehen wird, z. @NotNull, @Email (Annotation im Ruhezustand) Wenn also während der Eingabe der Daten vom Benutzer die Werte überprüft werden können und das Ergebnis des Bindungsergebnisses die Validierungsergebnisse liefert .bindingResult.hasErrors() zeigt an, ob eine Validierung fehlgeschlagen ist. 

1
puneet goyal

Ein weiterer praktischer Aspekt von @Valid, der oben nicht erwähnt wurde, besteht darin, dass @Valid (mit Postman zum Testen eines Endpunkts) die Ausgabe eines falschen REST - Aufrufs in formatiertem JSON formatiert. Dies ist sehr nützlich, wenn Sie eine kommerziell nutzbare API für Ihre Benutzer erstellen. 

0
Sean Gildea