Acho que sei para onde vai sua pergunta. E como essa pergunta é a que aparece nos principais resultados de pesquisa do Google, posso dar uma resposta simples sobre o que a anotação @Valid faz.
Vou apresentar 3 cenários de como usei @Valid
Modelo:
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>
...
Controlador para o cenário 1:
@RequestMapping("processForm")
public String processFormData(@Valid @ModelAttribute("employee") Employee employee){
return "employee-confirmation-page";
}
Neste cenário, depois de enviar seu formulário com um campo lastName vazio, você obterá uma página de erro, pois está aplicando regras de validação, mas não está lidando com isso de forma alguma.
Exemplo do referido erro:
página de exceção
Controlador para o cenário 2:
@RequestMapping("processForm")
public String processFormData(@Valid @ModelAttribute("employee") Employee employee,
BindingResult bindingResult){
return bindingResult.hasErrors() ? "employee-form" : "employee-confirmation-page";
}
Nesse cenário, você está passando todos os resultados dessa validação para o bindingResult, então cabe a você decidir o que fazer com os resultados da validação desse formulário.
Controlador para o cenário 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){
}
Nesse cenário, você ainda não está lidando com os erros como no primeiro cenário, mas passa isso para outro método que cuidará da exceção de que @Valid dispara ao processar o modelo de formulário. Verifique isso para ver o que fazer com o mapeamento e tudo mais.
Resumindo : @Valid por si só não faz mais nada que acione a validação dos campos anotados JSR 303 de validação ( @NotNull, @Email, @Size, etc ... ), você ainda precisa especificar uma estratégia do que fazer com os resultados dessa validação.
Espero ter conseguido esclarecer algo para as pessoas que podem tropeçar com isso.
@Valid
emApplicationForm
parâmetro, mas, ainda validações foram disparados nadate
(Definir comonull
) campo. Por favor explique.