Differenza tra @Valid e @Validated in primavera


106

Spring supporta due diversi metodi di convalida: convalida Spring e convalida bean JSR-303. Entrambi possono essere usati definendo un validatore Spring che delega ad altri delegatori incluso il validatore bean. Fin qui tutto bene.

Ma quando si annotano metodi per richiedere effettivamente la convalida, è un'altra storia. Posso annotare in questo modo

@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Valid @RequestBody TestObject obj, BindingResult result) {

o così

@RequestMapping(value = "/object", method = RequestMethod.POST)
public @ResponseBody TestObject create(@Validated @RequestBody TestObject obj, BindingResult result) {

Qui, @Valid è javax.validation.Valid e @Validated è org.springframework.validation.annotation.Validated . I documenti per quest'ultimo dicono

Variante di JSR-303 valida, che supporta la specifica dei gruppi di convalida. Progettato per un comodo utilizzo con il supporto Spring JSR-303 ma non specifico per JSR-303.

che non aiuta molto perché non dice esattamente in che modo è diverso. Se non del tutto. Entrambi sembrano funzionare abbastanza bene per me.


2
Potrebbe essere interessante: stackoverflow.com/questions/18911154/...
Wim Deblauwe

4
"supportare la specifica dei gruppi di convalida" è un'affermazione molto esplicita.
un oliver migliore

Dovrei pensare che Valid sia strettamente associato alle convalide JSR 303 (NotNull, ecc.). Considerando che puoi creare altri gruppi / convalida e farli controllare in Convalidato.
Atul

@zeroflagL, vero, ma dal momento che non l'ho mai usato, ho perso il punto e mi sono fissato invece sulla parte "non specifica JSR-303". Adesso è chiaro.
Sergei Tachenov

Risposte:


83

Come hai citato dalla documentazione, è @Validatedstato aggiunto il supporto per i "gruppi di convalida", cioè un gruppo di campi nel bean convalidato. Questo può essere utilizzato in moduli a più passaggi in cui è possibile convalidare nome, e-mail, ecc. Nel primo passaggio e poi altri campi nei passaggi successivi.

Il motivo per cui questo non è stato aggiunto @Validall'annotazione è perché è standardizzato utilizzando il processo della comunità java (JSR-303), che richiede tempo e gli sviluppatori Spring volevano consentire alle persone di utilizzare questa funzionalità prima.

Vai a questo biglietto Jira per vedere come è nata l'annotazione.


112

Una risposta più diretta. Per coloro che ancora non sanno cosa diavolo è "gruppo di convalida" .

Utilizzo per la @Validconvalida

controller:

@RequestMapping(value = "createAccount")
public String stepOne(@Valid Account account) {...}

Oggetto modulo:

public class Account {

    @NotBlank
    private String username;

    @Email
    @NotBlank
    private String email;

}

Utilizzo per @ValidatedValidation Group
Origine: http://blog.codeleak.pl/2014/08/validation-groups-in-spring-mvc.html

controller:

@RequestMapping(value = "stepOne")
public String stepOne(@Validated(Account.ValidationStepOne.class) Account account) {...}

@RequestMapping(value = "stepTwo")
public String stepTwo(@Validated(Account.ValidationStepTwo.class) Account account) {...}

Oggetto modulo:

public class Account {

    @NotBlank(groups = {ValidationStepOne.class})
    private String username;

    @Email(groups = {ValidationStepOne.class})
    @NotBlank(groups = {ValidationStepOne.class})
    private String email;

    @NotBlank(groups = {ValidationStepTwo.class})
    @StrongPassword(groups = {ValidationStepTwo.class})
    private String password;

    @NotBlank(groups = {ValidationStepTwo.class})
    private String confirmedPassword;

}

grazie @ Zhuhang.jasper per aver spiegato in dettaglio con grande semplicità.
Gautam Tyagi,

Questo è esattamente quello che stavo cercando nelle ultime 2 ore, grazie @ Zhuhang.jasper
Shady Hussein

grazie @zhuhang. stavo cercando questo.
Vishnu Dahatonde

4

Nell'esempio frammenti di codice della domanda @Valide @Validatednon fanno differenza. Ma se @RequestBodyè annotato con un Listoggetto o è un valore stringa annotato da @RequestParam, la convalida non avrà effetto.

Possiamo usare la @Validatedcapacità di validazione a livello di metodo di per farlo funzionare. Per raggiungere questo obiettivo, il punto chiave è posizionarsi @Validatedsulla classe. Questa potrebbe essere un'altra importante differenza tra @Valide @Validatedin spring framework.

refrence


Puoi spiegare perché l'annotazione non ha effetto sugli Listoggetti? Presumo che questo non funzionerà anche per altre collezioni come Map? Forse mi potrebbe dare una spiegazione più dettagliata nella mia interrogazione: stackoverflow.com/questions/60167961/...
Theiaz

1
@Theiaz Come desideri
Lebecca

1

oltre a quanto sopra, puoi solo applicare @Validsu un dominio / campo per la convalida nidificata, non con un @validated.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.