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'
- Maven项目在pom.xml中添加依赖:
- 校验注解导入包错误:检查实体类中
@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
相关产品推荐
相关产品推荐

