Sanırım sorunun nereye gittiğini biliyorum. Ve bu soru, Google'ın arama ana sonuçlarında açılan soru olduğu için, @Valid ek açıklamasının ne yaptığına dair sade bir cevap verebilirim.
@ Valid'i nasıl kullandığıma dair 3 senaryo sunacağım
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>
...
Senaryo 1 için kontrolör:
@RequestMapping("processForm")
public String processFormData(@Valid @ModelAttribute("employee") Employee employee){
return "employee-confirmation-page";
}
Bu senaryoda, formunuzu boş bir lastName alanıyla gönderdikten sonra, doğrulama kurallarını uyguladığınız ancak bununla hiçbir şekilde ilgilenmediğiniz için bir hata sayfası alırsınız.
Bahsedilen hataya örnek:
İstisna sayfası
Senaryo 2 için kontrolör:
@RequestMapping("processForm")
public String processFormData(@Valid @ModelAttribute("employee") Employee employee,
BindingResult bindingResult){
return bindingResult.hasErrors() ? "employee-form" : "employee-confirmation-page";
}
Bu senaryoda, bu doğrulamadan tüm sonuçları bindingResult'a geçiriyorsunuz, bu nedenle bu formun doğrulama sonuçlarıyla ne yapacağınıza karar vermek size kalmış.
Senaryo 3 için kontrolör:
@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){
}
Bu senaryoda, ilk senaryodaki gibi hataları hala işlemiyorsunuz , ancak bunu , form modelini işlerken @Valid'in tetiklediği istisnayı dikkate alacak başka bir yönteme aktarıyorsunuz . Kontrol bu haritalama ve bütün bu ne yapacağını görmem.
Özetlemek gerekirse : @Valid, JSR 303 ek açıklamalı alanların ( @NotNull, @Email, @Size, vb. ) Doğrulamasını tetikleyen başka bir şey yapmadan kendi başına ne yapmanız gerektiğine dair bir strateji belirlemeniz gerekir. söz konusu doğrulamanın sonuçları ile.
Umarım bununla karşılaşabilecek insanlar için bir şeyi açıklığa kavuşturabilmişimdir.
@Valid
,ApplicationForm
ancak yine de doğrulamalardate
(ayarlandınull
) alanında tetikleniyordu . Lütfen açıkla.