首页 > 其他分享 >同一实体多字段的不同校验--validate

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

时间:2023-06-12 16:38:08浏览次数:35  
标签:String -- 校验 private BasicArea 分组 validate


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


文章目录

  • 前言
  • 一、举个例子
  • 二、使用步骤
  • 1.引入依赖
  • 2. 加入分组标识
  • 3. 分组校验应用
  • 1. 明确知道当前接口方法(新增/修改)
  • 2. 不明确当前接口方法(修改增加为同一个接口)
  • 总结



前言

实际开发中遇到这样一个问题,一个接收参数的实体类,作为修改和新增的接口的入参,但是主键在新增中不是必传的,在修改中是必传的,那么如何用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.引入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
            <version>2.4.3</version>
   </dependency>

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{

    }
    
}

3. 分组校验应用

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

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

@RequestMapping("/validate")
    public Object validate(@RequestBody @Validated(BasicArea.update.class)BasicArea basicArea){

        
        return "SUCCESS";
    }

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

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

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

@Autowired
    private ValidatorFactory validatorFactory;

    @RequestMapping("/validate")
    public Object validate(@RequestBody BasicArea basicArea) {
    
        Set<ConstraintViolation<BasicArea>> validate = validatorFactory.getValidator().validate(basicArea, BasicArea.update.class);
        for (ConstraintViolation<BasicArea> basicAreaConstraintViolation : validate) {
            System.out.println(basicAreaConstraintViolation.getPropertyPath() + basicAreaConstraintViolation.getMessage() + basicAreaConstraintViolation.getInvalidValue());
        }
        return "SUCCESS";
    }

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


总结

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

快来试试吧!!

同一实体多字段的不同校验--validate_实体类


标签:String,--,校验,private,BasicArea,分组,validate
From: https://blog.51cto.com/u_16158506/6463428

相关文章

  • 一句话设计模式6:享元模式
    享元模式:局部单例模式。文章目录享元模式:局部单例模式。前言一、享元模式的作用二、如何实现享元模式总结前言享元模式其实很简单,但是如果用好,确实可以达到减少内存,事半功倍的效果;适合系统要创建大量相似对象,相同对象等;一、享元模式的作用1享元模式可以解决对象的重复......
  • 【Nginx学习笔记】-初识Nginx
    目录Nginx特点Nginx基本功能Nginx使用场景Nginx安装/卸载Docker方式运行Ubuntu上安装卸载NginxNginx命令Nginx目录结构Nginx热部署Nginx运行原理Master-Worker模式Nginx如何做到高并发下的高效处理?Nginx高可用Nginx中文文档-https://www.nginx.cn/doc/Nginx("enginex"......
  • 【算法基础】:(三)插入排序
    java基础算法算法基础:开始回顾下基础算法中的经典排序算法插入排序算法思想:一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增1的有序表。在其实现过......
  • 过年发红包的思考
    文章目录前言一、思路二、代码实现总结前言不出正月都是年,给大家拜个年!新年好~过年在群里发红包,然后大家抢红包,红包有大有小,但是刚刚好会被抢完,想着自己实现下吧~~有感而发~春节像是做了一场热闹的梦,车站道别的话语言不由衷,离别时的行囊总比回家的重,珍重珍重下次梦......
  • ChatGTP--事务是否生效?
    项目场景:由于最近在做一个项目的cola代码改造,所以由于cola需要在service和dao层中间加一层>>>gateway,和springcloud中的gateway不一样,这个仅仅是抽象了一层;思考:现在我的事务依然在service中开启,那么我的事务经过了一个gateway后,再次调用dao层,事务是否会生效?1生效......
  • 文件minio进阶 分页查询
    文章目录前言一、minio使用二、代码1.mino版本是最新的,那么pom中也要最新的2.部分代码总结前言就是现在通过minio管理文件,然后不需要其他信息,所以我也就没有用传统方式,在mysql中做文件记录,直接用minio做了文件存储,以及文件查询;一、minio使用1docker安装最新版minio.开......
  • 【Django学习笔记】-环境搭建
    对于初学django新手,根据以下步骤可以快速进行Django环境搭建虚拟环境创建使用virtualenv创建并启用虚拟机环境,关于virtualenv可参考https://www.yuque.com/binowen/tn8zvy/insclepipinstallvirtualenvvirtualenv./envsourceenv/bin/activate创建project1.使用pipinstall安装......
  • 【算法基础】:(四)选择排序
    java基础算法算法基础:开始回顾下基础算法中的经典排序算法选择排序是插入排序的一种算法思想:选择排序在开始的时候,先扫描整个列表,以找到列表中的最小元素,然后将这个元素与第一个元素进行交换。这样最小元素就放到它的最终位置上。然后,从第二个元素开始扫描,找到n-1个元素中的最小......
  • linux服务器CPU飙高排查
    文章目录前言一、第一步top二、根据pid查找具体线程2.根据pid找到16进制3.根据进程和线程查找原因总结前言系统cpu飙高,尤其对于后端人员来说,其实应该学会排查,这样也算是综合能力的体现;那么当出现了cpu严重飙高的时候怎么排查呢?一、第一步top直接在问题服务器输入命令:to......
  • 静态博客搭建工具汇总
    Jekyll、Hugo、Hexo是简单的博客形态的静态站点生产机器。它有一个模版目录,其中包含原始文本格式的文档,通过Markdown以及Liquid转化成一个完整的可发布的静态网站,你可以发布在任何你喜爱的服务器上。Jekyll、Hugo、Hexo也可以运行在码云(Gitee.com)Pages上,也就是说,你可以使......