Springboot做分组校验

目录

分组校验

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它能够让你动态的定义一个校验组的顺序。

  • 19
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

银氨溶液

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值