Vì springmvc 3.x bây giờ hỗ trợ jsr303 và trình xác nhận kiểu dáng mùa xuân cũ, tôi muốn trộn chúng trong các ứng dụng mẫu của tôi. Nhưng chỉ có một phương pháp được kích hoạt cho một bộ điều khiển xác định, đó là giới hạn của khung công tác Spring hay tiêu chuẩn JSR?Trình xác thực Springmvc jsr303 cùng tồn tại với trình xác nhận hợp lệ SpringDataBinder trong một hành động
Đây là mã mẫu của tôi.
User.java, viết tắt của mô hình miền, sử dụng JSR303 để xác thực.
public class User{
@Size(max = 16, message = "user loginId max-length is 16")
private String loginId;
//omit getter and setter
}
UserValidator.java, triển khai giao diện org.springframework.validation.Validator
để hỗ trợ xác thực người dùng.
public class UserValidator implements Validator {
private UserService userService;
public boolean supports(Class<?> clazz) {
return User.class.isAssignableFrom(clazz);
}
public void validate(Object target, Errors errors) {
User u = (User) target;
// loginName check for new user
if (u.getUserId() == null && !userService.isLoginIdUnique(u.getLoginId(), null)) {
errors.rejectValue("loginId", "user.loginId.unique", new Object[] { u.getLoginId() }, null);
}
}
@Autowired
public void setUserService(UserService userService) {
this.userService = userService;
}
}
UserController.java, sử dụng InitBinder
chú thích để tiêm UserValidator
vào WebDataBinder
.
@Controller("jspUserController")
@RequestMapping("/sys/users")
public class UserController {
private UserValidator userValidator;
@Autowired
public void setUserValidator(UserValidator userValidator) {
this.userValidator = userValidator;
}
/*@InitBinder("user")
public void initBinderUser(WebDataBinder binder) {
binder.setValidator(userValidator);
}*/
@RequestMapping(value = "/save")
public String save(@Valid User user, BindingResult bindingResult, Model model, HttpServletRequest request) {
if (bindingResult.hasErrors()) {
return "/sys/user/edit";
}
userService.saveUser(user);
return "redirect:/sys/users/index";
}
}
Nếu tôi bỏ ghi chú @InitBinder("user")
trong UserController, xác thực JSR303 sẽ bị tắt. Mặc dù mã nhận xét hiện tại sẽ sử dụng trình xác thực JSR để thực hiện xác thực. Bất cứ ai có thể cho tôi một cách giải quyết để trộn chúng trong một bộ điều khiển?
BTW, bạn có thể loại bỏ kích thước mã hóa cứng trong thông báo cho ràng buộc '@ Size' bằng cách sử dụng trình giữ chỗ, như sau:' "user loginId max-length là {max}" ' –