You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot+Thymeleaf用户注册问题:数据未入库且跳转失败

问题排查与修复方案

核心问题点

  1. 请求路径不匹配
    控制器类标注了@RequestMapping("/user"),所有接口默认带/user前缀,但前端表单的th:action="@{/createNewuser}"直接请求根路径接口,找不到对应Post接口,触发404错误;同时跳转成功页时,redirect:/successPage未加/user前缀,无法匹配/user/successPage的接口路径,跳转失败。

  2. 必填字段缺失+验证缺失
    前端仅提供name输入框,但代码中校验了email和手机号的唯一性,若UserEntity实体类中这两个字段设为非空约束(如@NotNull),提交空值会直接导致数据库保存失败;且实体类未添加验证注解时,BindingResult无法捕获空值等错误,直接走到保存逻辑抛出异常。

  3. (规范问题)方法名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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:47:02