• 同一实体多字段的不同校验--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中的分组校验,能达到相对复杂的业务校验逻辑,也无需创建多余的实体入参类了,分组校验,逼格更高~~
    快来试试吧!!

  • 相关阅读:
    「CSP-2023」我曾璀璨星空,星月相伴,致远方,致过往。
    3ds Max 基于PC系统的3D建模渲染和制作软件
    基于FTP协议的文件上传与下载
    使用Python输出三角形字符阵列
    (14)Zotero:文献管理工具,支持阅读器和翻译插件的私人研究助理
    c—线性表
    Linux waitqueue
    【面试经典150 | 滑动窗口】长度最小的子数组
    php的安装和卸载
    WotoKOL卧兔网络五周年深耕海外红人营销,WotoHub网红营销SAAS工具新推海外分销功能
  • 原文地址:https://blog.csdn.net/qq_32419139/article/details/127766433