Tôi nghĩ tôi biết câu hỏi của bạn đang hướng đến đâu. Và vì câu hỏi này là câu hỏi xuất hiện trong kết quả tìm kiếm chính của google, tôi có thể đưa ra câu trả lời đơn giản về chức năng của chú thích @Valid.
Tôi sẽ trình bày 3 tình huống về cách tôi đã sử dụng @Valid
Mô hình:
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>
...
Bộ điều khiển cho kịch bản 1:
@RequestMapping("processForm")
public String processFormData(@Valid @ModelAttribute("employee") Employee employee){
return "employee-confirmation-page";
}
Trong trường hợp này, sau khi gửi biểu mẫu của bạn với trường LastName trống, bạn sẽ nhận được một trang lỗi vì bạn đang áp dụng các quy tắc xác thực nhưng bạn không xử lý nó theo cách nào.
Ví dụ về lỗi đã nói:
Trang ngoại lệ
Bộ điều khiển cho kịch bản 2:
@RequestMapping("processForm")
public String processFormData(@Valid @ModelAttribute("employee") Employee employee,
BindingResult bindingResult){
return bindingResult.hasErrors() ? "employee-form" : "employee-confirmation-page";
}
Trong trường hợp này, bạn đang chuyển tất cả các kết quả từ quá trình xác thực đó đến bindResult, vì vậy, bạn có thể quyết định phải làm gì với kết quả xác thực của biểu mẫu đó.
Bộ điều khiển cho kịch bản 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){
}
Trong trường hợp này, bạn vẫn không xử lý các lỗi như trong trường hợp đầu tiên, nhưng bạn chuyển nó cho một phương thức khác sẽ xử lý ngoại lệ mà @Valid kích hoạt khi xử lý mô hình biểu mẫu. Kiểm tra điều này để xem phải làm gì với ánh xạ và tất cả những điều đó.
Tóm lại : @Valid tự nó mà không cần phải làm gì nữa để kích hoạt xác thực các trường được chú thích JSR 303 xác thực ( @NotNull, @Email, @Size, v.v. ), bạn vẫn cần chỉ định chiến lược về những việc cần làm với các kết quả xác nhận đã nói.
Hy vọng tôi có thể giải thích điều gì đó cho những người có thể gặp khó khăn với điều này.
@Valid
trênApplicationForm
tham số nhưng, các xác thực vẫn được kích hoạt trên trườngdate
(set asnull
). Vui lòng giải thích.