Spring Boot中BindingResult始终无错误的校验问题求助
问题排查与解决方案
核心问题:控制器参数顺序错误
Spring MVC 要求 BindingResult 参数必须紧挨着被 @Valid 注解的目标对象参数,否则框架无法将校验结果绑定到该 BindingResult 实例,导致 bindingResult.hasErrors() 始终返回 false。
你的控制器方法中,@ModelAttribute("confirmPassword") String confirmPassword 插在了 @Valid User user 和 BindingResult bindingResult 之间,破坏了这个规则。
修正方案
调整参数顺序,将 BindingResult 直接放在 @Valid User user 之后:
@PostMapping("/registration") public String registerUser(Model model, @Valid User user, BindingResult bindingResult, @ModelAttribute("confirmPassword") String confirmPassword) { if (bindingResult.hasErrors()) { model.addAttribute("allProjects", projectService.getAllProjects()); return "registration"; } // 其余逻辑保持不变 User existingUser = userService.findByLogin(user.getLogin()); if (existingUser != null) { model.addAttribute("userExistsError", true); model.addAttribute("allProjects", projectService.getAllProjects()); return "registration"; } if (!user.getPassword().equals(confirmPassword)) { model.addAttribute("passwordMismatch", true); model.addAttribute("allProjects", projectService.getAllProjects()); return "registration"; } userService.saveUser(user); return "redirect:/home"; }
额外检查项
确认Validation依赖:
若你使用的是 Spring Boot 2.3 及以上版本,需要手动引入spring-boot-starter-validation依赖(之前版本该依赖包含在spring-boot-starter-web中):<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>正则表达式修正:
你密码字段的正则表达式中.{8,$}是错误写法,应该改为.{8,}(表示至少8个字符),否则正则会失效:@Pattern(regexp = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])(?=\\S+$).{8,}", message = "Password must be at least 8 characters long, contain at least one digit, one lowercase letter, one uppercase letter, and one special character")
内容的提问来源于stack exchange,提问作者Zetta_11
相关产品推荐
相关产品推荐

