SpringBoot+Thymeleaf用户注册问题:数据未入库且跳转失败
问题排查与修复方案
核心问题点
请求路径不匹配
控制器类标注了@RequestMapping("/user"),所有接口默认带/user前缀,但前端表单的th:action="@{/createNewuser}"直接请求根路径接口,找不到对应Post接口,触发404错误;同时跳转成功页时,redirect:/successPage未加/user前缀,无法匹配/user/successPage的接口路径,跳转失败。必填字段缺失+验证缺失
前端仅提供name输入框,但代码中校验了email和手机号的唯一性,若UserEntity实体类中这两个字段设为非空约束(如@NotNull),提交空值会直接导致数据库保存失败;且实体类未添加验证注解时,BindingResult无法捕获空值等错误,直接走到保存逻辑抛出异常。(规范问题)方法名
createUawe为手滑输入错误,建议改为createUser保证代码可读性。
修复后的代码示例
1. 前端页面(userRegistration.html)
修正提交路径,补充email、手机号输入框及错误提示:
<form th:action="@{/user/createNewuser}" th:object="${user}" method="post"> <div class="form-group"> <label>NAME</label> <input type="text" th:field="*{name}" class="form-control" placeholder="Enter name" /> </div> <div class="form-group"> <label>EMAIL</label> <input type="email" th:field="*{email}" class="form-control" placeholder="Enter email" /> <span th:if="${#fields.hasErrors('email')}" th:errors="*{email}" class="text-danger"></span> </div> <div class="form-group"> <label>MOBILE NUMBER</label> <input type="tel" th:field="*{mobileNo}" class="form-control" placeholder="Enter mobile number" /> <span th:if="${#fields.hasErrors('mobileNo')}" th:errors="*{mobileNo}" class="text-danger"></span> </div> <div class="box-footer"> <button type="submit" class="btn btn-primary">SUBMIT</button> </div> </form>
2. 控制器代码(UserEntityController.java)
修正跳转路径,规范方法名:
@Controller @RequestMapping("/user") public class UserEntityController { @Autowired private UserEntityServiceImpl userServiceImpl; @GetMapping("/newUser") public String saveUser(Model model) { UserEntity user = new UserEntity(); model.addAttribute("user", user); return "userRegistration"; } @GetMapping("/successPage") public String successPage() { return "successPage"; } @PostMapping("/createNewuser") public String createUser(@ModelAttribute("user") UserEntity user, BindingResult bindResult, Model model) { if (bindResult.hasErrors()) { return "userRegistration"; } if (userServiceImpl.isEmailAlreadyRegistered(user.getEmail())) { bindResult.rejectValue("email", "error.user", "Email is already registered."); return "userRegistration"; } if (userServiceImpl.isMobileNoAlreadyRegistered(user.getMobileNo())) { bindResult.rejectValue("mobileNo", "error.user", "Mobile number is already registered."); return "userRegistration"; } user = userServiceImpl.saveUser(user); model.addAttribute("name", user.getName()); // 修正跳转路径,添加/user前缀 return "redirect:/user/successPage"; } }
3. 实体类添加验证注解(UserEntity.java)
让BindingResult能捕获空值、格式错误:
import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.Email; @Entity public class UserEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotEmpty(message = "Name cannot be empty") private String name; @NotEmpty(message = "Email cannot be empty") @Email(message = "Invalid email format") private String email; @NotEmpty(message = "Mobile number cannot be empty") private String mobileNo; // 生成对应的getter和setter方法 }
4. 检查Service层实现
确保UserEntityServiceImpl的保存及唯一性校验逻辑正确:
@Service public class UserEntityServiceImpl { @Autowired private UserEntityRepository userRepository; public boolean isEmailAlreadyRegistered(String email) { return userRepository.existsByEmail(email); } public boolean isMobileNoAlreadyRegistered(String mobileNo) { return userRepository.existsByMobileNo(mobileNo); } public UserEntity saveUser(UserEntity user) { return userRepository.save(user); } }
额外检查项
- 确认
application.properties中的数据库连接配置正确,SpringBoot可正常连接数据库; - 查看控制台日志,若仍有问题,日志会显示具体异常信息(如SQL约束违反、接口路径错误),可针对性排查。
内容的提问来源于stack exchange,提问作者nilnil
相关产品推荐
相关产品推荐

