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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 10:42:59