SpringBoot - 优雅的实现【参数校验】高级进阶
文章目录
- Pre
- 概述
- 参数校验三部曲
- Step1 搞依赖
- Step2 搞参数校验的实体类
- 常用的校验注解
- Step3 开始验证
- 存在的问题
- 使用 统一格式 + 全局异常Handler 优化
- 源码
Pre
SpringBoot - 优雅的实现【参数校验】高级进阶
SpringBoot - 优雅的实现【自定义参数校验】高级进阶
SpringBoot - 优雅的实现【参数分组校验】高级进阶
SpringBoot - 使用Assert校验让业务代码更简洁
概述
日常开发中,对入参进行参数校验是必不可少的一个环节。 而使用最多的就是Validator框架 。
Validator校验框架遵循了JSR-303 【Java Specification Requests】验证规范 。
这里我们探讨下,在boot项目中如何优雅的集成参数校验框架
参数校验三部曲
Step1 搞依赖
boot 2.3 以后版本的pom信息如下
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency></dependencies>
- spring boot-2.3之前的版本只需要引入 spring-boot-starter-web 即可 ,已经包含了
- spring boot-2.3及以后的版本,校验包是一个单独的starter,需要同时引入spring-boot-starter-validation
Step2 搞参数校验的实体类
package com.artisan.vo;import lombok.Data;
import org.hibernate.validator.constraints.Length;import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;/*** @author 小工匠* @version 1.0 * @mark: show me the code , change the world*/@Data
public class Artisan {private String id;@NotBlank(message = "名字为必填项")private String name;@Length(min = 8, max = 12, message = "password长度必须位于8到12之间")private String password;@Email(message = "请填写正确的邮箱地址")private String email;private String sex;@NotEmpty(message = "Code不能为空")private String code;
}
常用的校验注解
注解 | 功能 |
---|---|
@AssertFalse | 可以为null,如果不为null的话必须为false |
@AssertTrue | 可以为null,如果不为null的话必须为true |
@DecimalMax | 设置不能超过最大值 |
@DecimalMin | 设置不能超过最小值 |
@Digits | 设置必须是数字且数字整数的位数和小数的位数必须在指定范围内 |
@Future | 日期必须在当前日期的未来 |
@Past | 日期必须在当前日期的过去 |
@Max | 最大不得超过此最大值 |
@Min | 最大不得小于此最小值 |
@NotNull | 不能为null,可以是空 |
@Null | 必须为null |
@Pattern | 必须满足指定的正则表达式 |
@Size | 集合、数组、map等的size()值必须在指定范围内 |
必须是email格式 | |
@Length | 长度必须在指定范围内 |
@NotBlank | 字符串不能为null,字符串trim()后也不能等于“” |
@NotEmpty | 不能为null,集合、数组、map等size()不能为0;字符串trim()后可以等于“” |
@Range | 值必须在指定范围内 |
@URL | 必须是一个URL |
Step3 开始验证
注意看注释
package com.artisan.controller;import com.artisan.vo.Artisan;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;import javax.validation.constraints.Email;/*** @author 小工匠* @version 1.0* @mark: show me the code , change the world*/@RestController
@Slf4j
@Validated
@RequestMapping("/valid")
public class ArtisanController {/*** 使用@RequestBody注解,用于接受前端发送的json数据** @param artisan* @return*/@PostMapping("/testJson")public String testJson(@Validated @RequestBody Artisan artisan) {log.info("InComing Param {}", artisan);return "testJson valid success";}/*** 模拟表单提交** @param artisan* @return*/@PostMapping(value = "/testForm")public String testForm(@Validated Artisan artisan) {log.info("InComing Param is {}", artisan);return "testForm valid success";}/*** 模拟单参数提交** @param email* @return*/@PostMapping(value = "/testParma")public String testParma(@Email String email) {log.info("InComing Param is {}", email);return "testParma valid success";}}
testJson使用 @RequestBody注解,用于接受前端发送的json数据
testForm模拟表单提交
testParma模拟单参数提交
当使用单参数校验时需要在Controller上加上@Validated注解,否则不生效
【测试第一个接收JSON的接口 】
可以看到抛出的异常为: org.springframework.web.bind.MethodArgumentNotValidException
【测试第二个接收表单的接口 】
可以看到抛出的异常为: org.springframework.validation.BindException
【测试第三个接收单参数的接口 】
可以看到抛出的异常为:javax.validation.ConstraintViolationException
存在的问题
且不说好不好看, 不管怎么样,现在是通过Validation框架实现了校验。 当然了,我们的追求肯定不是这样的,Validator校验框架返回的错误提示太臃肿了 ,格式啥的都不一样,很难搞哦, 怎么给前台返回????
使用 统一格式 + 全局异常Handler 优化
增加统一返回 和 全局异常Handler,单独拦截参数校验的三个异常:javax.validation.ConstraintViolationException
,org.springframework.validation.BindException
,org.springframework.web.bind.MethodArgumentNotValidException
/*** @param e* @return*/@ExceptionHandler(value = {BindException.class, ValidationException.class, MethodArgumentNotValidException.class})public ResponseEntity<ResponseData<String>> handleValidatedException(Exception e) {ResponseData<String> resp = null;if (e instanceof MethodArgumentNotValidException) {// BeanValidation exceptionMethodArgumentNotValidException ex = (MethodArgumentNotValidException) e;resp = ResponseData.fail(HttpStatus.BAD_REQUEST.value(),ex.getBindingResult().getAllErrors().stream().map(ObjectError::getDefaultMessage).collect(Collectors.joining("; ")));} else if (e instanceof ConstraintViolationException) {// BeanValidation GET simple paramConstraintViolationException ex = (ConstraintViolationException) e;resp = ResponseData.fail(HttpStatus.BAD_REQUEST.value(),ex.getConstraintViolations().stream().map(ConstraintViolation::getMessage).collect(Collectors.joining("; ")));} else if (e instanceof BindException) {// BeanValidation GET object paramBindException ex = (BindException) e;resp = ResponseData.fail(HttpStatus.BAD_REQUEST.value(),ex.getAllErrors().stream().map(ObjectError::getDefaultMessage).collect(Collectors.joining("; ")));}log.error("参数校验异常:{}", resp.getMessage());return new ResponseEntity<>(resp, HttpStatus.BAD_REQUEST);}
重新测试
源码
https://github.com/yangshangwei/boot2
SpringBoot - 优雅的实现【参数校验】高级进阶相关推荐
- SpringBoot使用validation-api实现参数校验
SpringBoot使用validation-api实现参数校验 前言 我们在开发Java项目的时候,经常需要对参数进行一些必填项.格式.长度等进行校验,如果手写代码对参数校验,每个接口会需要很多低级 ...
- 使用 Spring Validation 优雅地进行参数校验
引言 不知道大家平时的业务开发过程中 controller 层的参数校验都是怎么写的?是否也存在下面这样的直接判断? public String add(UserVO userVO) {if(user ...
- SpringBoot中的Validator参数校验器——通过注解的方式控制controler接收参数的规则
前言 在日常的接口开发中,经常要对接口的参数做校验,例如,登录的时候要校验用户名密码是否为空.但是这种日常的接口参数校验太烦锁了,代码繁琐又多. Validator框架就是为了解决开发人员在开发的时候 ...
- SpringBoot @Validated注解实现参数校验
1. 前言 做web开发有一点很烦人就是要校验参数,基本上每个接口都要对参数进行校验,比如一些格式校验 非空校验都是必不可少的.如果参数比较少的话还是容易 处理的一但参数比较多了的话代码中就会出现大量 ...
- Spring Mvc Controller返回值、参数绑定、参数校验 (高级二)
1,Controller 返回值 返回moduleAndView 返回 String 返回void 2,Controller 参数绑定 客户端请求携带的key/value 键值对 绑定到 Contro ...
- springboot使用validator进行参数校验
前言 公司项目是前后端分离的,为了保证前端传输数据的合法性,对参数进行校验就很有必要.hibernate-validator就是一个不错的参数校验的解决方法.spring-boot-starter-w ...
- 一波带走,SpringBoot 中的各种参数校验方案汇总
点击关注公众号,实用技术文章及时了解 1.前言 在控制器类的方法里自己写校验逻辑代码当然也可以,只是代码比较丑陋,有点"low".业界有更好的处理方法,分别阐述如下. 2.Path ...
- java 参数校验 优雅的,SpringBoot 如何优雅的进行参数校验
参数的合法性直接影响到程序的安全和性能,因此在进行相关操作前必须检测对象是否为null,是否为blank,是否被初始化等等. 我们先来看看SpringBoot 是如何来检验参数的. 验证总是摆在第一位 ...
- SpringBoot 优雅的参数效验!
引言 不知道大家平时的业务开发过程中 controller 层的参数校验都是怎么写的?是否也存在下面这样的直接判断? public String add(UserVO userVO) {if(user ...
最新文章
- 【js】创建数组的三种方法
- sosoApi 环境搭建
- Linux环境下如何编译和执行c程序
- java防止表单重复提交
- C语言学习笔记(16)
- Fiddler抓包使用教程-Https
- 八数码深度优先搜索_深度优先搜索和广度优先搜索
- 小程序向java后台发送图片_微信小程序在后台如何将二进制流转换成图片
- 超越QQ Mail文件中转站---大文件上传设计思路和实践 原创 王泽宾
- 高项_第一章信息化和信息系统
- 在线 IDE,支持 C-sharp, PHP, JavaScript - CodeRun
- 2021年N1叉车司机新版试题及N1叉车司机考试试卷
- android二维码图片生成模糊的问题
- Anaconda 环境克隆、迁移
- linux蓝牙obex协议,蓝牙协议英文缩写——记录
- 卷积神经网络的参数计算
- 太原学院计算机科学与技术在哪个校区,太原学院有几个校区及校区地址
- Python-排序进阶(cmp_to_key)
- 百度飞桨公布最新成果:凝聚535万开发者,服务20万家企事业单位
- 阿里云邮箱验证,输入的邮箱地址明明是正确的,但是就是提示一直找不到邮件地址。
热门文章
- php连接plc,PLC 几种常见的连接口和通讯协议
- Ubuntu16.04运行VoxelNetRos
- tensorflow fetch 取回某个值
- 441. Arranging Coins
- 【数据可视化应用】华夫饼型柱状图(附R语言代码)
- MATLAB从入门到精通-matlab计算多重复杂多边形重叠面积
- Python编程基础:第十三节 循环控制语句Loop Control Statements
- 计算机科学和机器学习中的代数学、拓扑学、微积分以及最优化理论
- 推荐业务多目标建模算法介绍:MMOE、OMOE、Shared-Bottom
- 写给开发向产品转型的同学的3句话