接口校验
参考
优势
省去大量的校验代码
技术选型
jakarta.validation-api
@Validated(spring-context包的)和@Valid结合使用
@Validated和@Valid区别
Spring Validation验证框架对参数的验证机制提供了@Validated(Spring’s JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR-303规范),配合BindingResult(方法参数写上自动映射)可以直接提供参数验证结果
- 分组
@Validated:提供了一个分组功能,可以在入参验证时,根据不同的分组采用不同的验证机制
groups是验证分组,比如我有的验证只有更新的时候做,有的只有添加的时候做,就用这个
javax.validate里有提供一个默认分组Default.class是个接口,不指定分组时都会执行这个,分组是个空的接口
接口可以采用xxxAdd/xxxUpdate - 注解位置
@Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上
@Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上
//用在方法上
@Validated(Default.class)
public interface HelloService {
Object hello(@NotNull @Min(10) Integer id, @NotNull String name);
}
- 嵌套参数验证
@Valid支持嵌套参数验证(验证实体中的其他需要被验证的对象集合或其他对象)
总结用法
- controller 方法参数中用@Validated(分组考虑使用) 嵌套使用 @Valid
- 单个参数(非嵌套) 校验可以在 controller 的类上加 参数可不用加
- MethodArgumentNotValidException 全局异常处理类封装参数返回
- 自定义校验规则 自定义注解加自定义Validator(xxxValidator)如图
- 注解使用