Penso di sapere dove sia diretta la tua domanda. E poiché questa domanda è quella che compare nei risultati principali di ricerca di Google, posso dare una risposta semplice su ciò che fa l'annotazione @Valid.
Presenterò 3 scenari su come ho usato @Valid
Modello:
public class Employee{
private String name;
@NotNull(message="cannot be null")
@Size(min=1, message="cannot be blank")
private String lastName;
}
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 per lo scenario 1:
@RequestMapping("processForm")
public String processFormData(@Valid @ModelAttribute("employee") Employee employee){
return "employee-confirmation-page";
}
In questo scenario, dopo aver inviato il modulo con un campo lastName vuoto, riceverai una pagina di errore poiché stai applicando regole di convalida ma non lo stai gestendo in alcun modo.
Esempio di detto errore:
pagina di eccezione
Controller per lo scenario 2:
@RequestMapping("processForm")
public String processFormData(@Valid @ModelAttribute("employee") Employee employee,
BindingResult bindingResult){
return bindingResult.hasErrors() ? "employee-form" : "employee-confirmation-page";
}
In questo scenario, stai passando tutti i risultati da quella convalida a bindingResult, quindi spetta a te decidere cosa fare con i risultati della convalida di quel modulo.
Controller per lo scenario 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){
}
In questo scenario non stai ancora gestendo gli errori come nel primo scenario, ma lo passi a un altro metodo che si prenderà cura dell'eccezione che @Valid attiva durante l'elaborazione del modello di modulo. Controlla questo vedere cosa fare con la mappatura e tutto il resto.
Per riassumere : @Valid da solo non fa altro che attivare la convalida dei campi annotati JSR 303 di convalida ( @NotNull, @Email, @Size, ecc ... ), è comunque necessario specificare una strategia di cosa fare con i risultati di detta validazione.
Spero di essere riuscito a chiarire qualcosa per le persone che potrebbero inciampare con questo.
@Valid
ilApplicationForm
parametro ma, le convalide sono state ancora attivate sul campodate
(impostato comenull
). Spiega per favore.