SpringBoot系列18-validation分组校验+自定义参数校验器

2023-05-16

SpringBoot系列18-validation分组校验+自定义参数校验器

    • [原文链接: https://www.lskyf.com/post/212](https://www.lskyf.com/post/212)
    • 分组-加入依赖
    • 分组-定义分组接口,均为空接口
    • 分组-UserBean.java
    • 分组测试代码-GroupController.java
    • 自定义校验器-新增CustomUseGroup.java接口
    • 自定义校验器-StatusConstraintValidator.java
    • 自定义校验器-定义自定义注解Status(可以参照@NotNull注解)
    • 自定义校验器-新建默认消息提示文件配置
    • 自定义校验器-UserBean.java新增如下代码
    • 自定义校验器-测试GroupController.java代码
    • JSR303注解使用场景列表
    • 小技巧:常用消息提示可参照源码ValidationMessages_zh_CN.properties查看

原文链接: https://www.lskyf.com/post/212

分组-加入依赖

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

分组-定义分组接口,均为空接口

/**
 * 新增用户组
 */
public interface AddUserGroup {

}
/**
 * 修改用户组
 */
public interface UpdateUseGroup {

}

分组-UserBean.java

/**
 * @author yuanfenge
 * @description
 * @createTime 2019 - 3 - 18 11:54
 *
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserBean {
    public static final int ONLINE=1;//在线
    public static final int OFFLINE=-1;//离线
    public static final int LEAVE=2;//离开
    public static final int BUSY=3;//忙碌

    @NotNull(message = "不能为空",groups = {UpdateUseGroup.class})
    private Long id;
    @NotNull(message = "不能为空",groups = {AddUserGroup.class})
    private String name;
    @NotNull(message = "不能为空",groups = {AddUserGroup.class,UpdateUseGroup.class})
    private Integer age;
   }

分组测试代码-GroupController.java

@RestController
public class GroupController {
    /**
     * 没有指定分组接口,不会进行任何校验
     * @param user
     * @return
     */
    @GetMapping("/invalid")
    public UserBean invalid(@Validated UserBean user){
        return user;
    }

    /**
     * 测试地址: http://localhost:8080/add?name=%E5%B0%8F%E6%98%8E&age=18
     * @param user
     * @return
     */
    @GetMapping("/add")
    public UserBean userAdd(@Validated(AddUserGroup.class) UserBean user){
        return user;
    }
}

自定义校验器-新增CustomUseGroup.java接口

/**
 * 自定义校验器分组
 */
public interface CustomUseGroup {

}

自定义校验器-StatusConstraintValidator.java


/**
 * @author yuanfenge
 * @description 自定义StatusConstraintValidator implements ConstraintValidator<自定义注解类,要校验的参数类型>
 */
public class StatusConstraintValidator implements ConstraintValidator<Status,Integer> {
    Set<Integer> set=new HashSet<>();

    /**
     * 初始化时将数据添加到集合中
     * @param annotation
     */
    @Override
    public void initialize(Status annotation) {
        int[] values = annotation.values();
        for (int v:values) {
            if (!set.contains(v)){
                set.add(v);
            }
        }
    }

    /**
     * 在此方法进行校验
     * @param value
     * @param context
     * @return
     */
    @Override
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        // TODO 校验业务代码
        //如果值符合校验通过
        return set.contains(value);
    }
}

自定义校验器-定义自定义注解Status(可以参照@NotNull注解)


@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE })
@Retention(RUNTIME)
@Documented
@Constraint(validatedBy = { StatusConstraintValidator.class})//指定StatusConstraintValidator校验器,可以指定多个校验器
public @interface Status {
    //指定错误默认提示信息
    String message() default "{com.yuanfenge.valid.group.custom.Status.error}";
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default { };
    
    //定义注解方法:接收一个数组
    int [] values() default { };
}

自定义校验器-新建默认消息提示文件配置

resources下新建ValidationMessages.properties

com.yuanfenge.valid.group.custom.Status.error=状态错误

自定义校验器-UserBean.java新增如下代码

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public class UserBean {
            //自定义校验器Status
            @Status(values={ONLINE,OFFLINE,LEAVE,BUSY},groups = {CustomUseGroup.class})
            private Integer status;
    }

自定义校验器-测试GroupController.java代码

@RestController
public class GroupController {
          /**
           * 测试地址:http://localhost:8080/customValid?status=100
           * 自定义校验器地址:
           * @param user
           * @return
           */
          @GetMapping("/customValid")
          public UserBean customizeValid(@Validated(CustomUseGroup.class) UserBean user){
              return user;
          }
}

JSR303注解使用场景列表

注解使用场景
AssertFalse只能为false
AssertTrue只能为true
DecimalMax必须小于${inclusive == true ? ‘或等于’ : ‘’}{value}
DecimalMin必须大于${inclusive == true ? ‘或等于’ : ‘’}{value}
Digits数字的值允许范围(只允许在{integer}位整数和{fraction}位小数范围内)
Email一个合法的电子邮件地址
Future需要是一个将来的时间
FutureOrPresent需要是一个将来或现在的时间
Max最大不能超过{value}
Min最小不能小于{value}
Negative必须是负数
NegativeOrZero必须是负数或零
NotBlank不能为空
NotEmpty不能为空
NotNull不能为null
Null必须为null
Past需要是一个过去的时间
PastOrPresent需要是一个过去或现在的时间
Pattern需要匹配正则表达式"{regexp}"
Positive必须是正数
PositiveOrZero必须是正数或零
Size个数必须在{min}和{max}之间

小技巧:常用消息提示可参照源码ValidationMessages_zh_CN.properties查看

源码下载链接

原文链接: https://www.lskyf.com/post/212

作者:猿份哥,版权所有,欢迎保留原文链接进行转载:)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot系列18-validation分组校验+自定义参数校验器 的相关文章

  • 【Qt线程-2】事件循环(QCoreApplication::processEvents,exec)的应用

    背景 xff1a 个人学习多线程控制 xff0c 写了一些博文用于记录 Qt线程 1 this xff0c volatile xff0c exec xff0c moveToThread Qt线程 3 使用事件循环 xff0c 信号 xff0
  • 【Qt线程-4】事件循环嵌套,BlockingQueuedConnection与QWaitCondition比较

    背景 xff1a 个人学习多线程控制 xff0c 写了一些博文用于记录 xff1a Qt线程 1 this xff0c volatile xff0c exec xff0c moveToThread Qt线程 2 事件循环 xff08 QCo
  • 【Qt样式(qss)-3】几套配色方案

    背景 xff1a 之前写过有关qss的博客 xff0c 记录了如何使用qt手册 xff0c 以及在项目中如何使用qss的体验 经过实践 xff0c 我归纳了自己需要的qss使用方法 xff0c 使之尽量高效 xff0c 容易维护 Qt样式
  • 【Qt样式(qss)-4】应用到QMdiArea不生效的解决

    背景 xff1a 之前写记录过几篇qss相关内容 xff1a Qt样式 xff08 qss xff09 1 手册小结 xff08 附例 xff1a 软件深色模式 xff09 Qt样式 xff08 qss xff09 2 使用小结 xff08
  • Google play billing(Google play 内支付) 下篇

    开篇 xff1a 如billing开发文档所说 xff0c 要在你的应用中实现In app Billing只需要完成以下几步就可以了 第一 把你上篇下载的AIDL文件添加到你的工程里 xff0c 第二 把 lt uses permissio
  • Qt creator中操作QAction加入QToolBar

    背景 xff1a 个人笔记 我之前没有系统化学习过任何资料 xff0c 使用很多工具都是按需出发 xff0c 直接上手 xff0c 遇到问题再研究的 所以会有一些弯路 本文言语中难免有对个人情绪的生动描述 xff0c 希望不要影响读者心情
  • Java 通过map构造树形结构

    在开发中 xff0c 经常会有将 数据组装成为树形结构的场景 xff0c 除了可以通过递归实现 xff0c 还可以通过map 组装实现 一 xff0c 构造基本数据 import apple laf JRSUIUtils import co
  • 【无标题】es搜索基本操作

    一 xff0c 准备数据 1 创建索引 PUT lagou book 2 创建mapping PUT lagou book doc mapping 34 properties 34 34 description 34 34 type 34
  • 【ES】常用操作工具

    工欲善其事 xff0c 必先利于器 xff0c es使用过程中 xff0c 有些工具能帮助我们快速的上手和使用 一 es head es head 是一款专门针对 es的客户端工具elasticSearch配置包 是一个基于node js的
  • 【es】基本概念理解

    一 xff0c 初识es 1 是什么 xff1f ElasticSearch 简称es 开源的分布式的全文搜索引擎 xff0c 可以近乎实时的存储检索数据 xff0c es使用java开发 xff0c 并且使用Lucene作为核心实现搜索功
  • 无法安装net framework 3.5 的解决方法

    电脑刚重装了Windows8 1系统 xff0c 然后安装数据库的时候 xff0c 却出现了这样的问题 xff1a 您的电脑上的应用需要使用以下windows功能 问题原因是 xff1a 在安装系统的时候 xff0c NET Framewo
  • 【计算机网络原理】第四章 数据链路层

    今天主要梳理了一下数据链路层的内容 xff0c 如下 一 宏观规划 综合数据链路层的整体 xff0c 分为两大部分 xff0c 第一部分讲解数据链路层的功能 xff0c 第二部分讲解数据链路层的功能 这些协议 xff0c 其实还是为了实现数
  • 【redis】关系型数据库 VS 非关系型数据库

    一 关系型数据库 xff1f 1 概念 关系型数据库是指采用了关系模型来组织数据的数据库 简单来说 xff0c 关系模式就是二维表格模型 主要代表 xff1a SQL Server xff0c Oracle Mysql PostgreSQL
  • resultful风格接口

    一 产生背景 网络应用程序 xff0c 越来越流行前端和后端的分离设计 当前的发展趋势是前端的设计层出不穷 比如 xff1a 各种型号的手机 平板灯其他设计 因为必须要一种统一的机制方便不同的前端和后端进行通信 这就导致了API结构的流行
  • 【kafka】Exception thrown when sending a message with key='null' and payload='lizhenjuan;99' to topic

    今天碰到一个奇怪的问题 xff0c 如下图 xff1a 一 问题 1 问题截图 上午还可以发送消息成功的 xff0c 下午突然就发送不了消息了 我就检查我代码的问题 xff0c 是传递的格式不对 xff0c 还是数据要求不对 网上的资料显示
  • 【0723】自动化运维——saltstack

    24 1 自动化运维介绍 认识自动化运维 xff1a 传统运维效率低 xff0c 大多工作人为完成传统运维工作繁琐 xff0c 容易出错传统运维每日重复做相同的事情传统运维没有标准化流程传统运维的脚本繁多 xff0c 不能方便管理自动化运维
  • 【mysql】order by多个字段排序

    今天遇到了两个字段排序的问题 xff0c 感觉不是很清晰 xff0c 所有又按照规则查询了下 xff0c 总结下 count都是306的有三个 现在需要同时按照age和count排序 xff0c 测试最后的排序结果 默认都是按照age和co
  • java8使用积累

    1 将List lt T gt 数组转换为String并用逗号隔开 String join 34 34 List 2 idea自动补全代码教程 xff1a https www cnblogs com HF Made p 11417225 h
  • 【java】手动分页工具类

    最近小编遇到一个很绕的问题 xff0c 无法使用mybatis自带的分页插件对符合条件的数据进行分页 xff0c 故收集了一个自动分页的工具类 xff1a public static lt T gt List lt T gt getPage
  • redis 使用bitMap实现统计系统在线用户数量

    BitMap xff0c 简单来说 xff0c 其实也就是 byte 数组 xff0c 用二进制表示 xff0c 一个bit的值 xff0c 或者是0 xff0c 或者是1 xff1b 也就是说一个bit能存储的最多信息是2 它用一个bit

随机推荐