Pre
SpringBoot - 优雅的实现【自定义参数校验】高级进阶
SpringBoot - 优雅的实现【参数分组校验】高级进阶
需求
我们经常会碰到这样的一个场景: 新增的时候某些字段为必填(比如密码), 更新的时候非必填。
实现三部曲
Validator校验框架提供了分组校验,可以帮助我们快速的实现这样的需求。
Step1 定义分组接口
import javax.validation.groups.Default; /** * @author 小工匠 * @version 1.0 * @description: TODO * @date 2022/2/21 23:03 * @mark: show me the code , change the world */ public interface CustomValidateGroup extends Default { interface Crud extends CustomValidateGroup { interface Create extends Crud { } interface Update extends Crud { } interface Query extends Crud { } interface Delete extends Crud { } } }
定义一个分组接口CustomValidateGroup
让其继承javax.validation.groups.Defaul
t,再在分组接口中定义出多个不同的操作类型,Create,Update,Query,Delete.
Step2 给参数分配分组
@Length(min = 8, max = 12, message = "password长度必须位于8到12之间") @NotNull(groups = CustomValidateGroup.Crud.Create.class,message = "新增接口密码不能为空") @Null(groups = CustomValidateGroup.Crud.Update.class) private String password;
Step3 指定分组
给需要参数校验的方法指定分组
/** * 新增的时候 不能为空 * @param artisan * @return */ @PostMapping(value = "/add") public String add(@Validated(value = CustomValidateGroup.Crud.Create.class) Artisan artisan){ log.info("InComing Param is {}", artisan); return "add valid success"; } /** * 更新的时候 可以为空 * @param artisan * @return */ @PostMapping(value = "/update") public String update(@Validated(value = CustomValidateGroup.Crud.Update.class) Artisan artisan){ log.info("InComing Param is {}", artisan); return "update valid success"; }
通过value属性给add()和update()方法分别指定Create和Update分组
Step4 验证
新增,期望 密码不能为空 ,我们填个空试试
【修改】
对于未指定分组的则使用的是默认分组 。 比如由于email属于默认分组,而我们的分组接口CustomValidateGroup
已经继承了Default分组,所以也是可以对email字段作参数校验的
如果CustomValidateGroup没有继承Default分组,那在代码属性上就需要加上@Validated(value = {ValidGroup.Crud.Create.class, Default.class}
才能让email字段的校验生效。
源码
https://github.com/yangshangwei/boot2