关于 Spring Boot 参数校验的启用

因为看到项目中 @Valid/@Validated 注解有的加在 Class 上,有的加在方法参数上,所以测试一下到底哪些情况需要加,哪些不需要加。

分别设计了几种校验场景:

  1. @GetMapping + 校验注解 + 基本类型
  2. @GetMapping + @RequestParam + 校验注解 + 基本类型
  3. @GetMapping + Object 类型
  4. @PostMapping + @RequestBody + Object 类型

然后分别在如下场景执行了测试:

  1. 在类上添加 @Valid/@Validated 注解;
  2. Object 类型参数上添加 @Valid/@Validated 注解。

测试代码

测试结果见接口上的备注:

请求示例:

可以得到类似如下内容的报错信息:

<!-- jakarta.validation.ConstraintViolationException -->
query.name:长度需要在 0 和 10 之间
query.age:需要在 18 和 60 之间

<!-- org.springframework.web.method.annotation.HandlerMethodValidationException -->
name:长度需要在 0 和 10 之间
age:需要在 18 和 60 之间

<!-- org.springframework.web.bind.MethodArgumentNotValidException -->
name:长度需要在 0 和 10 之间
age:需要在 18 和 60 之间
  

总结

  1. 直接在基本参数上添加的校验注解始终会起作用,只是如果在类上添加 @Validated 注解会改变抛出的异常的类型;
  2. 使用 Object 类型的参数接收请求时,必须在方法的参数上添加 @Valid@Validated 注解,否则对象字段上的校验注解不会起作用。