Spring Boot表单验证错误信息不显示且错误数据仍被保存的问题求助
Spring Boot表单验证错误信息不显示且错误数据仍被保存的问题求助
大家好,我正在开发一个Spring Boot应用,用@Valid和BindingResult做表单验证,但遇到了一个头疼的问题:当我提交空的姓名字段时,验证错误信息完全不显示,程序反而直接尝试保存数据,最后因为数据库的唯一约束抛出SQL异常(空字符串重复)。
问题详情
我的User实体类中,name字段添加了以下验证约束:
@NotBlank(message = "Name field should be required") @Size(min = 2, max = 20, message = "min 2 characters and max 20 characters allowed") private String name;
完整的User实体类代码:
package com.ninja.entity; import java.util.ArrayList; import java.util.List; import javax.validation.constraints.NotBlank; import javax.validation.constraints.Size; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.OneToMany; import jakarta.persistence.Table; @Entity @Table(name = "User") public class User { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; @NotBlank(message = "Name field should be required") @Size(min = 2, max = 20, message = "min 2 characters and max 20 characters allowed") private String name; @Column(unique = true) private String email; private String password; private String role; private Boolean enabled; private String imageUrl; @Column(length = 500) private String about; @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY,mappedBy = "user") private List<Contact> contacts = new ArrayList<>(); // 省略getter、setter方法 }
对应的控制器POST方法:
@RequestMapping(value = "/do_register", method = RequestMethod.POST) public String registerUser( @ModelAttribute("user")@Valid User user,BindingResult result, @RequestParam(value = "agreement" , defaultValue = "false")boolean agreement, Model model,HttpSession session) { try { if(result.hasErrors()) { System.out.println("Error "+result.toString()); model.addAttribute("user",user); return "signup"; } if(!agreement) { System.out.println("You didn't accept the agreement"); throw new Exception("You didn't accept the agreement"); } user.setRole("Role_User"); user.setEnabled(true); user.setImageUrl("default.png"); System.out.println(agreement); System.out.println(user); User userResult = this.userRepository.save(user); model.addAttribute("user",new User()); session.setAttribute("message", new Message("User successfully registered ! ","alert-success")); return "signup"; } catch (Exception e) { e.printStackTrace(); model.addAttribute("user",user); session.setAttribute("message", new Message("Something went wrong! "+e.getMessage(),"alert-danger")); return "signup"; } }
前端Thymeleaf的姓名输入框代码:
<!--Name Input Field --> <div class="mb-3"> <label for="name_field" class="form-label">Your Name</label> <input name="name" required type="text" class="form-control" th:classappend="${#fields.hasErrors('name')} ? 'is-invalid' : ''" id="name_field" th:value="${user.name}" placeholder="Enter your name here" /> <!-- Display validation message --> <div class="invalid-feedback" th:if="${#fields.hasErrors('name')}" th:errors="*{name}"> Name error</div> </div> <!--Name Input Field End Here-->
已尝试的解决步骤
我已经排查了这些点,但问题依然存在:
- 确认BindingResult确实捕获到了错误(控制台能打印出错误日志)
- 试过在表单字段中使用
th:field="*{name}"(当前代码用的是th:value,两种方式都测试过) - 确保用
th:errors="*{name}"来渲染错误信息 - 验证
@Valid注解的位置正确(紧跟在@ModelAttribute之后)
预期与实际结果
我预期的是:提交空姓名或不符合长度要求的姓名时,页面会显示对应的验证错误,不会执行保存数据的逻辑。
但实际情况是:验证消息完全不显示,程序直接走到保存数据的步骤,最终抛出SQL异常:
Something went wrong! could not execute statement [Duplicate entry '' for key 'user.UKob8kqyqqgmefl0aco34akdtpe']
备注:内容来源于stack exchange,提问作者PRAJWAL BHANARKAR
相关产品推荐
相关产品推荐

