Myślę, że wiem, dokąd zmierza twoje pytanie. A ponieważ to pytanie pojawia się w głównych wynikach wyszukiwania Google, mogę udzielić prostej odpowiedzi na temat tego, co robi adnotacja @Valid.
Przedstawię 3 scenariusze dotyczące korzystania z @Valid
Model:
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>
...
Kontroler dla scenariusza 1:
@RequestMapping("processForm")
public String processFormData(@Valid @ModelAttribute("employee") Employee employee){
return "employee-confirmation-page";
}
W tym scenariuszu po przesłaniu formularza z pustym polem lastName zostanie wyświetlona strona błędu, ponieważ stosujesz reguły walidacji, ale w ogóle jej nie obsługujesz.
Przykład błędu:
strona wyjątków
Kontroler dla scenariusza 2:
@RequestMapping("processForm")
public String processFormData(@Valid @ModelAttribute("employee") Employee employee,
BindingResult bindingResult){
return bindingResult.hasErrors() ? "employee-form" : "employee-confirmation-page";
}
W tym scenariuszu przekazujesz wszystkie wyniki z tego walidacji do bindingResult, więc od Ciebie zależy, co zrobić z wynikami walidacji tego formularza.
Kontroler dla scenariusza 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){
}
W tym scenariuszu nadal nie obsługujesz błędów, jak w pierwszym scenariuszu, ale przekazujesz to do innej metody, która zajmie się wyjątkiem, który wyzwala @Valid podczas przetwarzania modelu formularza. Sprawdź to, zobacz, co zrobić z mapowaniem i tak dalej.
Podsumowując : @Valid samodzielnie, nie robiąc nic więcej, co wyzwala walidację pól z adnotacjami JSR 303 ( @NotNull, @Email, @Size, itp. ), Nadal musisz określić strategię tego, co robić z wynikami tej walidacji.
Mam nadzieję, że udało mi się wyjaśnić coś dla ludzi, którzy mogą się z tym potknąć.
@Valid
naApplicationForm
parametr, ale nadal validations padły nadate
(ustawionej jakonull
) pola. Proszę wytłumacz.