• 同一实体多字段的不同校验--validate


    validate的使用,同一实体分组校验 ValidatorFactory


    前言

    实际开发中遇到这样一个问题,一个接收参数的实体类,作为修改和新增的接口的入参,但是主键在新增中不是必传的,在修改中是必传的,那么如何用validation 校验呢?


    一、举个例子

    我有实体类如下:

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class BasicArea {
    
        private String id;
    
        /**
        * 区域名称
        */
        private String name;
    
    
        /**
        * 区域备注
        */
        private String remark;
    
        /**
        * 父级区域id
        */
    
        @NotNull(message = "不能为null")
        private String parentId;
    
        /**
        * 所有父级区域id
        */
        @Min(value=3,message = "长度最小值为3")
        @Max(value=30,message = "长度最大值为30")
        private String path;
    
        /**
        * 区域层级
        */
        private Integer depth;
    
        /**
        * 扩展属性
        */
        private String extend;
    
        /**
        * 排序号
        */
        private Integer sort;
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    即是修改入参,也是新增入参;现在要分别校验,我们采用分组校验的方式

    二、使用步骤

    1.引入依赖

       
                org.springframework.boot
                spring-boot-starter-validation
                2.4.3
       
    
    • 1
    • 2
    • 3
    • 4
    • 5

    2. 加入分组标识

    增加后的实体

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class BasicArea {
    
        @NotBlank(groups={update.class})
        private String id;
    
        /**
        * 区域名称
        */
        private String name;
    
    
        /**
        * 区域备注
        */
        private String remark;
    
        /**
        * 父级区域id
        */
    
        @NotNull(message = "不能为null")
        private String parentId;
    
        /**
        * 所有父级区域id
        */
        @Min(value=3,message = "长度最小值为3",groups = {add.class})
        @Max(value=30,message = "长度最大值为30")
        private String path;
    
        /**
        * 区域层级
        */
        private Integer depth;
    
        /**
        * 扩展属性
        */
        private String extend;
    
        /**
        * 排序号
        */
        private Integer sort;
    
        public interface add{
    
        }
    
        public interface update{
    
        }
        
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    3. 分组校验应用

    1. 明确知道当前接口方法(新增/修改)

    改造controller即可,例如我知道当前为修改接口

        @RequestMapping("/validate")
        public Object validate(@RequestBody @Validated(BasicArea.update.class)BasicArea basicArea){
    
            
            return "SUCCESS";
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    @Validated 开启校验
    BasicArea.update.class 开启分组校验,只有分组是 update的时候,才会校验,其他不加分组的字段,正常校验
    本文中: id 在此处会做@NotBlank的判断

    2. 不明确当前接口方法(修改增加为同一个接口)

    需要通过判断当前是新增还是修改,改造如下; 新增同理

      @Autowired
        private ValidatorFactory validatorFactory;
    
        @RequestMapping("/validate")
        public Object validate(@RequestBody BasicArea basicArea) {
        
            Set> validate = validatorFactory.getValidator().validate(basicArea, BasicArea.update.class);
            for (ConstraintViolation basicAreaConstraintViolation : validate) {
                System.out.println(basicAreaConstraintViolation.getPropertyPath() + basicAreaConstraintViolation.getMessage() + basicAreaConstraintViolation.getInvalidValue());
            }
            return "SUCCESS";
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    例如经过判断为修改,通过此种方式校验;
    如Set validate集合不为空,则校验不通过;


    总结

    以上就是Validate中的分组校验,能达到相对复杂的业务校验逻辑,也无需创建多余的实体入参类了,分组校验,逼格更高~~
    快来试试吧!!

  • 相关阅读:
    C++交叉编译grpc
    mysql不是内部或外部命令,也不是可运行的程序或批处理文件解决
    面试题 16.16. 部分排序-双指针法
    华三交换机知道ip怎么查找主机ip在接入交换机哪个端口下
    【openwrt学习笔记】miniupnpd学习笔记
    有赞的考题越来越难了
    英特尔发布超百万亿算力GPU,进军数据中心
    如何理解Linux文件IO?
    带你玩转Redis 的String 数据类型
    [vue3+elementuiplus]el-select下拉框会自动触发校验规则的最强解决方案
  • 原文地址:https://blog.csdn.net/qq_32419139/article/details/127766433