首页 > 其他分享 >Springboot做分组校验

Springboot做分组校验

时间:2024-03-30 14:30:18浏览次数:26  
标签:Insert Springboot 校验 class 分组 测试 public

目录

分组校验

Insert分组

Upload分组

测试接口

测试结果

添加测试

更新测试

顺序校验@GroupSequence

自定义分组校验

自定义分组表单

 CustomSequenceProvider

 测试接口

测试结果

Type类型为A

 Type类型为B

总结:


前文提到了做自定义的校验注解,接下来的这篇文章将带领各位了解分组校验注解的实现~

        有时我们在做新增或修改的时候需要用到用同一个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它能够让你动态的定义一个校验组的顺序。

标签:Insert,Springboot,校验,class,分组,测试,public
From: https://blog.csdn.net/qq_71416673/article/details/136989263

相关文章