2010-08-29 25 views
36

Nell'esempio seguente, il parametro ScriptFile è contrassegnato con un'annotazione .Cosa indica l'annotazione @Valid in primavera?

Cosa fa l'annotazione @Valid?

@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();   
}  

risposta

26

È per scopi di convalida.

Validazione È comune convalidare un modello dopo aver collegato l'input dell'utente ad esso. Spring 3 fornisce supporto per la convalida dichiarativa con JSR-303. Questo supporto è abilitato automaticamente se un provider JSR-303, come ad esempio Hibernate Validator, è presente su il classpath. Quando è abilitato, è possibile grilletto convalida semplicemente annotare un metodo di controllo parametro con l'annotazione @Valid: Dopo il legame in arrivo POST parametri, l'AppointmentForm sarà essere validato; in questo caso, per verificare il valore del campo data non è nullo e si verifica in futuro.


Guardate qui per ulteriori informazioni:
http://blog.springsource.com/2009/11/17/spring-3-type-conversion-and-validation/

8

IIRC @Valid non è un'annotazione primavera ma un'annotazione JSR-303 (che è lo standard Bean Validation). Quello che fa è fondamentalmente controlla se i dati che invii al metodo sono validi o meno (convaliderà lo scriptFile per te).

1

Semplicemente aggiungendo alla risposta di cui sopra, in un'applicazione web @valid viene utilizzato dove il bean da convalidare viene anche annotato con annotazioni di convalida, ad es. @NotNull, @Email (annotazione di ibernazione) in modo tale che quando si riceve un input dall'utente, i valori possano essere convalidati e il risultato del binding avrà i risultati della convalida. bindingResult.hasErrors() indicherà se una convalida non è riuscita.

5

In aggiunta alle risposte di cui sopra, dai un'occhiata a seguente. La colonna della data di AppointmentForm è annotata con un paio di annotazioni. Avendo l'annotazione @Valid che attiva le convalide su AppointmentForm (in questo caso @NotNull e @Future). Queste annotazioni potrebbero provenire da diversi fornitori JSR-303 (ad esempio, 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; 
    } 
1
public String create(@Valid @NotNull ScriptFile scriptFile, BindingResult result, ModelMap modelMap) {  
    if (scriptFile == null) throw new IllegalArgumentException("A scriptFile is required");   

Credo che questo @NotNull annotazione è valida, pertanto, se non è necessaria condizione.

3

@Valid di per sé non ha nulla a che fare con Spring. Fa parte delle specifiche Bean Validation (ce ne sono diverse, l'ultima è JSR 380 a partire dalla seconda metà del 2017), ma @Valid è molto vecchia e deriva interamente da JSR 303.

Come tutti sappiamo, Spring è molto brava a fornire integrazione con tutte le diverse JSR e le librerie java in generale (si pensi a JPA, JTA, Caching, ecc.) E naturalmente anche quei ragazzi si sono occupati della convalida. Uno dei componenti chiave che facilita questo è MethodValidationPostProcessor.

Cercando di rispondere alla tua domanda - @Valid è molto utile per la cosiddetta cascata di convalida quando si desidera convalidare un grafico complesso e non solo un elemento di livello superiore di un oggetto. Ogni volta che vuoi andare più a fondo, devi usare @Valid. Questo è ciò che dice JSR. La primavera si conformerà a questo con alcune deviazioni minori (ad esempio, ho provato a inserire @Validated invece di sul metodo RestController e funziona la convalida, ma lo stesso non si applica a un normale "servizio" bean).

Problemi correlati