背景
实际开发过程中,为了方便,通常一个入参req会在多个接口中使用。但是虽然使用同一个入参类,但是不同的接口所需的参数不同,这个时候就需要我们根据不同的接口功能来确定每个接口必填的参数,这个时候就需要用到我们的分组校验@Validated了。
场景:新增insert及更新update
CRUD是系统中最常见的功能,下面就拿insert、update来做一个示例。
一般而言,我们会根据数据的id来执行更新操作,而新增时主键id却是自增的(或者雪花算法,总之不需要手动填写)。所以insert和update最大的区别就是id字段是否必填。
1、自定义两个接口insert、update
public interface Update {
}
public interface Insert {
}
2、对于不同功能必填字段做分组标识
@Data
public class StudentDTO {
/**
* count 用于 判断 数据(存在则更新,不存在则插入)
*/
private Integer count;
/**
* 只在group = update.class时校验id not null
*/
@NotNull(groups = {Update.class})
private Integer id;
private Integer age;
private String name;
private Integer gender;
private Integer subject;
}
3、在需要校验的接口位置添加@Validated校验
/**
* validated分组校验
*
* @param dto
* @return
*/
@PostMapping("/update")
public NormalResponse updateStudent(@Validated(value = Update.class) @RequestBody StudentDTO dto) {
testService.saveOrUpdate(dto);
return NormalResponse.ok();
}
/**
* validated分组校验
*
* @param dto
* @return
*/
@PostMapping("/insert")
public NormalResponse InsertStudent(@Validated(value = Insert.class) @RequestBody StudentDTO dto) {
testService.saveOrUpdate(dto);
return NormalResponse.ok();
}
我们在入参req的属性id上添加的group分组标识为update,更新接口上的@Validated分组校验同样指定为update;新增接口上@Validated分组校验指定为insert,此时id的必填校验只会在更新接口才会触发。这样我们就简单的实现了一个用于insert和update的分组校验。
依照这个逻辑,我们可以扩展并根据自己的业务需要自定义分组group来校验不同需求下参数的校验。