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

REST应用中@Valid注解失效:非法数据仍存入数据库

问题描述

发送如下JSON请求到REST接口:

{
    "name": "",
    "age": -30
}

即使Person实体类已添加校验注解:

@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;

@Column(name = "name")
@NotEmpty(message = "Name mustn't be empty!")
@Size(min = 2, max = 20, message = "Name must be between 2 and 20 characters long!")
private String name;

@Column(name = "age")
@Min(value = 1, message = "Age must be greater than 0!")
private int age;

且Controller方法已使用@Valid注解:

@PostMapping
public ResponseEntity<HttpStatus> create(@RequestBody @Valid Person person, BindingResult bindingResult) {
    if (bindingResult.hasErrors()) {
        StringBuilder errorMsg = new StringBuilder();

        List<FieldError> errors = bindingResult.getFieldErrors();
        for (FieldError error : errors) {
            errorMsg.append(error.getField()).append(" - ").append(error.getDefaultMessage()).append(";");
        }

        throw new PersonNotCreatedException(errorMsg.toString());
    }

    personService.savePerson(person);

    return ResponseEntity.ok(HttpStatus.OK);
}

但@Valid注解未生效,空名称、负年龄的非法数据仍被存入数据库,控制台显示org.springframework.validation.BeanPropertyBindingResult: 0 errors,请问原因是什么?

问题原因及解决办法
  • 缺少校验依赖:Spring Boot 2.3版本之后,spring-boot-starter-validation不再作为web starter的默认依赖,必须手动添加。没有该依赖的话,所有校验注解都会失效。
    • Maven项目在pom.xml中添加依赖:
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-validation</artifactId>
      </dependency>
      
    • Gradle项目在build.gradle中添加依赖:
      implementation 'org.springframework.boot:spring-boot-starter-validation'
      
  • 校验注解导入包错误:检查实体类中@NotEmpty、@Min、@Size的包路径,必须是javax.validation.constraints(Spring Boot 2.x)或jakarta.validation.constraints(Spring Boot 3.x)下的注解。如果导入的是Hibernate Validator旧包或其他第三方包,校验逻辑不会被Spring识别。
  • BindingResult参数位置违规:虽然你的代码中BindingResult紧跟在@Valid修饰的Person参数后是正确的,但如果后续调整代码时把其他参数插在两者之间,Spring会直接抛出校验异常,而不会将错误信息存入BindingResult,这点需要注意。

内容的提问来源于stack exchange,提问作者elenwen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 19:18:15