引入依赖:
org.springframework.boot spring-boot-starter-web2.3.7.RELEASE jakarta.validation jakarta.validation-api2.0.1
controller开启检验:
@RestController
@Validated // 开启List类型参数检验
public class ValidController {
@PostMapping("valid-list2")
public String test2(@Valid @RequestBody List users) {
return "valid success2";
}
}
实体类定义校验规则:
public class User {
@NotEmpty(message = "姓名不能为空")
private String name;
@Size(max = 11, message = "手机号码不能超过11位")
private String phone;
@Past(message = "出生日期位今天之前的日期")
private LocalDateTime birthday;
@Positive(message = "年龄只能是正数")
private Integer age;
@Override
public String toString() {
return "User{" +
", name='" + name + ''' +
", phone='" + phone + ''' +
", birthday='" + birthday + ''' +
", age=" + age +
'}';
}
}
发送请求:
POST http://localhost:8055/valid-list2
Content-Type: application/json
[
{
"name": "",
"birthday": "2022-09-26T15:55:55",
"age": -1,
"phone": "1234567891011"
}
]
校验结果:
javax.validation.ConstraintViolationException: test2.users[0].age: 年龄只能是正数, test2.users[0].name: 姓名不能为空, test2.users[0].birthday: 出生日期位今天之前的日期, test2.users[0].phone: 手机号码不能超过11位 at org.springframework.validation.beanvalidation.MethodValidationInterceptor.invoke(MethodValidationInterceptor.java:116)
注意:像这种下面这样方式,参数不正确产生的异常是:MethodArgumentNotValidException
@RestController
public class ValidController2 {
@PostMapping("valid")
public String test(@Valid @RequestBody User user) {
return "valid success";
}
}
这两种参数校验异常不一样的,走的处理逻辑也是不一样的,具体可以看spring源码。
参数处理涉及的类有以下几个(不完全):想了解更详细的处理逻辑可以debug追一下源码
ValidatorImpl:实际校验规则实现类,hibernate的实现。



