目录
前文提到了做自定义的校验注解,接下来的这篇文章将带领各位了解分组校验注解的实现~
有时我们在做新增或修改的时候需要用到用同一个dto类,但是新增需要某个字段,修改有不需要用到某个字段,这个时候可能还没学分组校验的你想到可以建两个dto类来实现这样的需求,其实是可以的,但是重复的代码会让整个项目变得冗余,所以这个时候分组校验由此诞生~
SpringBoot 2.3.x 移除了validation
依赖需要手动引入依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
分组校验
首先我们来看看实体类:
@Data
public class User {
/**
* id
*/
@Null(message = "新增时id必须为空", groups = {Insert.class})
@NotNull(message = "更新时id不能为空", groups = {Update.class})
private String id;
/**
* 类型
*/
@NotEmpty(message = "姓名不能为空" , groups = {Insert.class})
private String name;
/**
* 年龄
*/
@NotEmpty(message = "年龄不能为空" , groups = {Insert.class})
private String age;
}
Insert分组
public interface Insert {
}
Upload分组
public interface Update {
}
测试接口
/**
* 添加用户
*/
@PostMapping("/addUser")
public ResultVo addUser(@RequestBody @Validated({Insert.class}) User user){
// 选择对应的分组进行校验
return ResultVoUtil.success(user);
}
/**
* 更新用户
*/
@PostMapping("/updateUser")
public ResultVo updateUser(@RequestBody @Validated({Update.class}) User user){
// 选择对应的分组进行校验
return ResultVoUtil.success(user);
}
测试结果
添加测试
更新测试
顺序校验@GroupSequence
在@GroupSequence
内可以指定,分组校验的顺序。比如说@GroupSequence({Insert.class, Update.class, User.class})
先执行Insert
校验,然后执行Update
校验。如果Insert
分组,校验失败了,则不会进行Update
分组的校验。这里就不做演示了,有兴趣的小伙伴可以去其他博主写的文章下面看看哦~
自定义分组校验
对于之前提到了当xxType值为A,paramA值必传。xxType值为B,paramB值必须传这样的场景。单独使用分组校验和分组序列是无法实现的。需要使用@GroupSequenceProvider
才行。
自定义分组表单
@Data
@GroupSequenceProvider(value = CustomSequenceProvider.class)
public class CustomGroupForm {
/**
* 类型
*/
@Pattern(regexp = "[A|B]" , message = "类型不必须为 A|B")
private String type;
/**
* 参数A
*/
@NotEmpty(message = "参数A不能为空" , groups = {WhenTypeIsA.class})
private String paramA;
/**
* 参数B
*/
@NotEmpty(message = "参数B不能为空", groups = {WhenTypeIsB.class})
private String paramB;
/**
* 分组A
*/
public interface WhenTypeIsA {
}
/**
* 分组B
*/
public interface WhenTypeIsB {
}
}
CustomSequenceProvider
public class CustomSequenceProvider implements DefaultGroupSequenceProvider<CustomGroupForm> {
@Override
public List<Class<?>> getValidationGroups(CustomGroupForm form) {
List<Class<?>> defaultGroupSequence = new ArrayList<>();
defaultGroupSequence.add(CustomGroupForm.class);
if (form != null && "A".equals(form.getType())) {
defaultGroupSequence.add(CustomGroupForm.WhenTypeIsA.class);
}
if (form != null && "B".equals(form.getType())) {
defaultGroupSequence.add(CustomGroupForm.WhenTypeIsB.class);
}
return defaultGroupSequence;
}
}
测试接口
/**
* 自定义分组
*/
@PostMapping("/customGroup")
public ResultVo customGroup(@RequestBody @Validated CustomGroupForm form){
return ResultVoUtil.success(form);
}
测试结果
Type类型为A
Type类型为B
总结:
GroupSequence
注解是一个标准的Bean认证注解。正如之前,它能够让你静态的重新定义一个类的,默认校验组顺序。然而GroupSequenceProvider
它能够让你动态的定义一个校验组的顺序。