Springboot参数校验复制即用

引入依赖

<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId><version>2.0.1.Final</version>
</dependency>
<dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.0.20.Final</version>
</dependency>

入参校验

参数字段上使用校验注解 例: @NotNull(message = “客户id不能为空”)

@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="####", description="")
public class AddParam implements Serializable {@ApiModelProperty(value = "客户id")@NotNull(message = "客户id不能为空")private Long customerId;}

控制层使用 @Validated 注解

  @ApiOperation("####")@PostMapping("add")@Transactionalpublic JsonData addMedical(@RequestBody @Validated AddParam addParam) {return JsonData.buildSuccess();}

异常处理

处理Get请求,抛出BindException异常
处理请求参数格式错误 @RequestParam上,抛出ConstraintViolationException异常
处理请求参数格式错误 @RequestBody上,抛出MethodArgumentNotValidException

@ControllerAdvice
@Slf4j
public class ExceptionHandle{/*** 校验错误拦截处理* 处理Get请求中 使用@Valid 验证路径中请求实体校验失败后抛出的异常** @param exception 错误信息集合* @return 错误信息*/@ResponseBody@ExceptionHandler(BindException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)public BaseResponse bindExceptionHandler(BindException exception) {log.error("BindException encountered: {0}", exception);String message =exception.getBindingResult().getAllErrors().stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining());return BaseResponse.newError("YourProjectName_BindException", message);}/*** 校验错误拦截处理* 处理请求参数格式错误 @RequestParam上validate失败后抛出的异常是javax.validation.ConstraintViolationException** @param exception 错误信息集合* @return 错误信息*/@ResponseBody@ExceptionHandler(ConstraintViolationException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)public BaseResponse constraintViolationHandler(ConstraintViolationException exception) {log.error("ConstraintViolation exception encountered: {0}", exception);return BaseResponse.newError("YourProjectName_ConstraintViolation", exception.getMessage());}/*** 校验错误拦截处理* 处理请求参数格式错误 @RequestBody上validate失败后抛出的异常是MethodArgumentNotValidException异常。** @param exception 错误信息集合* @return 错误信息*/@ResponseBody@ExceptionHandler(MethodArgumentNotValidException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)public BaseResponse methodArgumentNotValidHandler(MethodArgumentNotValidException exception) {log.error("MethodArgumentNotValid exception encountered: {0}", exception);BindingResult bindingResult = exception.getBindingResult();StringBuilder sb = new StringBuilder();for (FieldError fieldError : bindingResult.getFieldErrors()) {sb.append(fieldError.getField()).append(": ").append(fieldError.getDefaultMessage()).append(", ");}return BaseResponse.newError("YourProjectName_MethodArgumentNotValid", sb.toString());}
}

配置多个请求参数校验失败,则遇到一个校验失败就抛出异常,接下来的异常参数不做校验

@Configuration
public class ValidatorConfig {@Beanpublic Validator validator() {ValidatorFactory validatorFactory = Validation.byProvider(HibernateValidator.class).configure()//failFast的意思只要出现校验失败的情况,就立即结束校验,不再进行后续的校验。.failFast(true).buildValidatorFactory();return validatorFactory.getValidator();}@Beanpublic MethodValidationPostProcessor methodValidationPostProcessor() {MethodValidationPostProcessor methodValidationPostProcessor = new MethodValidationPostProcessor();methodValidationPostProcessor.setValidator(validator());return methodValidationPostProcessor;}
}

校验时常用注解

  • @Valid 递归的对关联对象进行校验,如果关联对象是个集合或者数组,那么对其中的元素进行递归校验
  • @Pattern(value) 符合指定的正则表达式(校验非法字符)
  • @NotNull 参数不为 null
  • @NotEmpty 参数不能为null,或者是空
  • @NotBlank() 参数不能为null,或者被Trim的长度是否大于0(可以用来校验全为空格字符)
  • @Min() 一个数字,值大于给定值
  • @Max() 一个数字,值小于给定值
  • @Digits (integer, fraction) 一个数字,其值必须在可接受的范围内

注解常用案例

@Pattern(regexp = "^[\\u4E00-\\u9FA5\\w\\-]{1,57}$", message = "只能包含中文字符、英文字符、数字、下划线和中横线,1~57个字符")@Pattern(regexp = "^((?!=|\\+|-|@|>|<|%).)((?!>|<|%).){0,127}$", message = "不能以=,+,-或@开头,不能包含<,>和%字符,最长为128个字符")@Pattern(regexp = "^(?:false|true)$", message = "只支持false/true")@Pattern(regexp = "^[A-Za-z0-9]{32}$", message = "只能是32位的uuid(只有英文和字母)")@Pattern(regexp = "^[\\w-.;]{1,100}$", message = "最长为100,只能包含英文、数字、“-”、“_”、“;”")@Pattern(regexp = "^[/][/\\w-.]{1,254}$",message = "须以“/”开头,只能包含字母、数字、“/”、“_”、“-”和“.”," + "长度不少于2位,长度最长为255")@Pattern(regexp = "^(?:A|B)$", message = "类型必须为A或者B")@Max(value = 2_140_000_000, message = "只能大于0小于2140000")
@Min(value = 0, message = "只能大于0小于2140000")@Max(value = 5000, message = "分页大小在【1,5000】之间")
@Min(value = 1, message = "分页大小在【1,5000】之间")@Digits(integer = 1, fraction = 0, message = "只能为0或1")
@Max(value = 1, message = "只能为0或1")
@Min(value = 0, message = "只能为0或1")@NotEmpty(message = "缺少必要的参数,数组classIds不能为null,或者长度为0")private List<@Pattern(regexp = "^[a-zA-Z\\d]{32}$", message = "id仅由字母和数字组成,且长度为32个字符")@NotEmpty(message = "id不能为null或者为空") String>classIds;

自定义注解

自定义注解名称

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ParamValidator.class)
public @interface RetryTimes {String message() default "重试次数只能为1,2,4,8";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}

实现ConstraintValidator类

public class ParamValidator implements ConstraintValidator<RetryTimes, Short> {private static final Pattern PATTERN = Pattern.compile("^(?:0|5|10|20|50|100)$");@Overridepublic boolean isValid(Short retryTimes, ConstraintValidatorContext constraintValidatorContext) {return PATTERN.matcher(retryTimes.toString()).matches();}
}

使用注解

@RetryTimes
private short retryTimes;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/232125.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaSE 排序

目录 1 概念1.1 排序1.2 稳定性 2 常见基于比较排序算法总览3 插入排序3.1 直接插入排序3.1.1 思想3.1.2 实现3.1.3 性能分析 3.2 折半插入排序3.2.1 思想3.2.2 实现3.2.3 性能分析 3.3 希尔排序3.3.1 思想3.3.2 实现3.3.3 性能分析 4 选择排序4.1 选择排序4.1.1 思想4.1.2 实现…

神奇的数据恢复算法

今天码哥给大家带来一种数据备份与修复的技术——里德所罗门编码。 里德所罗门编码可是应用场景很多&#xff0c;例如我们耳熟能详的RAID&#xff08;磁盘阵列&#xff09;&#xff0c;又例如在UDP传输中降低丢包导致的数据缺失的情况等等。 什么是里德所罗门编码 这里&…

官网 Navicat Premium 历史版本官方下载地址

Navicat Premium 客户端命名规则&#xff0c;是 navicat大版本(2位)小版本(1位)_premium_cs_x32或者64位的系统.exe&#xff0c;比如&#xff1a; https://download.navicat.com/download/navicat162_premium_cs_x64.exe 表示大版本为16&#xff0c;小版本为2&#xff0c;64位系…

随时随地刷题题库小程序源码系统+完整代码包+安装部署教程

互联网的普及和在线教育的发展&#xff0c;越来越多的人开始利用碎片时间进行学习。为了满足这一需求&#xff0c;随时随地刷题题库小程序应运而生。该小程序提供了一个便捷的刷题平台&#xff0c;用户可以在任何时间、任何地点进行刷题练习&#xff0c;提高自己的学习效率。 …

C盘满了?这里有释放空间有效方案!

一、需要释放小空间 方法一&#xff0c;下载火绒安全软件&#xff0c;点击垃圾清理 方法二&#xff0c;手动清理&#xff1a; 1.左下角搜索"添加或删除" 2.左下角搜索"存储设置" 3.【我的电脑】-【C盘】-右键【属性】-【磁盘清理】 4.以下位置的不需要…

局域网其他pc如何访问宿主机虚拟机IP?

文章目录 背景贝瑞蒲公英设置虚拟机网络连接测试 背景 使用贝瑞蒲公英异地组网&#xff0c;将家里的pc作为pgsql服务器在公司使用&#xff0c;但是虚拟机的ip和端口访问不了 贝瑞蒲公英 设置虚拟机网络 就是添加端口转发规则 连接测试 公网内其他pc连接测试 可以看到已经连接成…

西南科技大学数据库实验八(自定义函数)

一、实验目的 1.掌握用户自定义变量; 2.熟悉运算符与表达式; 3.掌握begin-end语句块; 4.掌握重置命令结束标记。 5.掌握创建自定义函数的语法格式以及函数的创建与调用。 二、实验任务 1.创建学生表Student,由学号(Sno)、姓名(Sname)组成,记作:Student(Sno,Sname),…

学习Java第74天,Ajax简介

什么是ajax AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 不是新的编程语言&#xff0c;而是一种使用现有标准的新方法。 AJAX 最大的优点是在不重新加载整个页面的情况下&#xff0c;可以与服务器交换数据并更新部分网页…

freetype位图制作的理论与用法详解,一篇文章学会freetype

文档下载&#xff1a;freetype位图制作的理论与用法详解&#xff0c;一篇文章学会freetype 该文档详细讲述了 各种格式的字符串&#xff08;中文&#xff0c;英文&#xff09;编码&#xff0c;怎么使用freetype制作成可以在lcd上显示的位图&#xff0c;并且如何将位图渲染到LCD…

ERP真的“烂”吗?为什么有些公司上了ERP效率反而更低?

ERP是由美国Gartner Group咨询公司首先提出的国际上最先进的企业管理模式之一&#xff0c;也是企业信息化集成的最佳解决方案。 ERP到底是什么&#xff1f; ERP的概念 先打个比方。 把ERP理解成手机。 使用通讯类APP和同事、朋友、亲人交流。 使用购物类APP购买生活工作中需…

一文详细介绍Ehcache

title: Ehcache 快速入门 categories: 编程 Java 中间件 缓存 tags: Java 中间件 缓存 Ehcache abbrlink: 2720adf1 date: 2022-02-17 22:34:30 permalink: /pages/c4647d/ Ehcache 快速入门 EhCache 是一个纯 Java 的进程内缓存框架&#xff0c;具有快速、精干等特点&#xff…

中国九大农业区划

数据名称&#xff1a;中国九大农业区划 数据时间&#xff1a;2012年 数据空间位置:全国 数据空间分辨率&#xff1a;1:100万 数据格式&#xff1a;shp 数据坐标系&#xff1a;WGS1984 数据简介&#xff1a;农业区划是管理和指导农业生产的重要手段。我国农业区划种类较多…

如何在公网环境使用固定域名远程访问内网BUG管理系统协同办公

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

锐捷 | AP和AC 系列 默认IP地址和console密码,enable密码

1、无线设备的默认地址 &#xff1a; AC&#xff1a;10.x版本没有默认地址&#xff0c;11.x新版本默认地址192.168.110.1。 AP&#xff1a;默认地址192.168.110.1&#xff08;10.x 173487之前的P2版本是192.168.1.1&#xff09; WALL-AP或者有第二个LAN口的AP&#xff0c;胖…

评分卡在数字化时代的应用与比较,谁是最强规则引擎?

在数字化时代&#xff0c;规则引擎在各种业务场景中发挥着越来越重要的作用。评分卡作为规则引擎的一个重要应用&#xff0c;被广泛应用于员工KPI考核、业务评估、授信额度计算等等场景。本文引用了奔跑的小武哥的内容&#xff0c;对市面上的几个规则引擎进行对比展示&#xff…

Leetcode的AC指南 —— 链表:142.环形链表II

摘要&#xff1a; Leetcode的AC指南 —— 链表&#xff1a;142.环形链表II。题目介绍&#xff1a;给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 文章目录 一、题目二、解析1、快慢指针法2、一个破坏链表的解…

【PostgreSQL】从零开始:(十四)PostgreSQL-表的定义及表基础语法

PostgreSQL表类型 PostgreSQL支持以下几种表类型&#xff1a; 普通表&#xff08;Regular Table&#xff09;&#xff1a;这是最常用的表类型&#xff0c;用于存储数据。临时表&#xff08;Temporary Table&#xff09;&#xff1a;这些表只在当前会话中存在&#xff0c;并在…

原生html + vue3 获取引用元素refs - elementUI如何在setup中进行表单校验设置

背景&#xff1a; 原生Html 引入elementPlust vue3 &#xff0c;需要在vue3 setup里做表单校验&#xff0c;通过el-form refform 的refs元素执行校验。 解决方案1&#xff1a; 保存vue挂载之后实例vm为一个常量&#xff0c;由实例来获取&#xff1a;vm.$refs.form.validate(…

【数学证明 笔记02】完备性证明方法有哪些?

文章目录 一、声明二、构造完备性证明三、反证法四、递归论证五、假设扩展六、构造模型 一、声明 本帖持续更新中如有纰漏&#xff0c;望指正&#xff01; 二、构造完备性证明 原理 构造一个对象&#xff08;通常是序列、函数、集合等&#xff09;&#xff0c;证明它满足某种…

GBASE南大通用ADO.NET 结构

GBASE南大通用ADO.NET&#xff08;全称是 .NET Framework Data Provider For GBase&#xff09;提 供给.NET 应用程序访问 GBase 数据库、获取数据、管理数据的一套完整的解决 方案。 GBASE南大通用 ADO.NET 的四个核心类及若干功能类具有以下功能&#xff1a;  建立和管…