文章目录

  • 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 必须是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.ConstraintViolationExceptionorg.springframework.validation.BindExceptionorg.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 - 优雅的实现【参数校验】高级进阶相关推荐

  1. SpringBoot使用validation-api实现参数校验

    SpringBoot使用validation-api实现参数校验 前言 我们在开发Java项目的时候,经常需要对参数进行一些必填项.格式.长度等进行校验,如果手写代码对参数校验,每个接口会需要很多低级 ...

  2. 使用 Spring Validation 优雅地进行参数校验

    引言 不知道大家平时的业务开发过程中 controller 层的参数校验都是怎么写的?是否也存在下面这样的直接判断? public String add(UserVO userVO) {if(user ...

  3. SpringBoot中的Validator参数校验器——通过注解的方式控制controler接收参数的规则

    前言 在日常的接口开发中,经常要对接口的参数做校验,例如,登录的时候要校验用户名密码是否为空.但是这种日常的接口参数校验太烦锁了,代码繁琐又多. Validator框架就是为了解决开发人员在开发的时候 ...

  4. SpringBoot @Validated注解实现参数校验

    1. 前言 做web开发有一点很烦人就是要校验参数,基本上每个接口都要对参数进行校验,比如一些格式校验 非空校验都是必不可少的.如果参数比较少的话还是容易 处理的一但参数比较多了的话代码中就会出现大量 ...

  5. Spring Mvc Controller返回值、参数绑定、参数校验 (高级二)

    1,Controller 返回值 返回moduleAndView 返回 String 返回void 2,Controller 参数绑定 客户端请求携带的key/value 键值对 绑定到 Contro ...

  6. springboot使用validator进行参数校验

    前言 公司项目是前后端分离的,为了保证前端传输数据的合法性,对参数进行校验就很有必要.hibernate-validator就是一个不错的参数校验的解决方法.spring-boot-starter-w ...

  7. 一波带走,SpringBoot 中的各种参数校验方案汇总

    点击关注公众号,实用技术文章及时了解 1.前言 在控制器类的方法里自己写校验逻辑代码当然也可以,只是代码比较丑陋,有点"low".业界有更好的处理方法,分别阐述如下. 2.Path ...

  8. java 参数校验 优雅的,SpringBoot 如何优雅的进行参数校验

    参数的合法性直接影响到程序的安全和性能,因此在进行相关操作前必须检测对象是否为null,是否为blank,是否被初始化等等. 我们先来看看SpringBoot 是如何来检验参数的. 验证总是摆在第一位 ...

  9. SpringBoot 优雅的参数效验!

    引言 不知道大家平时的业务开发过程中 controller 层的参数校验都是怎么写的?是否也存在下面这样的直接判断? public String add(UserVO userVO) {if(user ...

最新文章

  1. 【js】创建数组的三种方法
  2. sosoApi 环境搭建
  3. Linux环境下如何编译和执行c程序
  4. java防止表单重复提交
  5. C语言学习笔记(16)
  6. Fiddler抓包使用教程-Https
  7. 八数码深度优先搜索_深度优先搜索和广度优先搜索
  8. 小程序向java后台发送图片_微信小程序在后台如何将二进制流转换成图片
  9. 超越QQ Mail文件中转站---大文件上传设计思路和实践 原创 王泽宾
  10. 高项_第一章信息化和信息系统
  11. 在线 IDE,支持 C-sharp, PHP, JavaScript - CodeRun
  12. 2021年N1叉车司机新版试题及N1叉车司机考试试卷
  13. android二维码图片生成模糊的问题
  14. Anaconda 环境克隆、迁移
  15. linux蓝牙obex协议,蓝牙协议英文缩写——记录
  16. 卷积神经网络的参数计算
  17. 太原学院计算机科学与技术在哪个校区,太原学院有几个校区及校区地址
  18. Python-排序进阶(cmp_to_key)
  19. 百度飞桨公布最新成果:凝聚535万开发者,服务20万家企事业单位
  20. 阿里云邮箱验证,输入的邮箱地址明明是正确的,但是就是提示一直找不到邮件地址。

热门文章

  1. php连接plc,PLC 几种常见的连接口和通讯协议
  2. Ubuntu16.04运行VoxelNetRos
  3. tensorflow fetch 取回某个值
  4. 441. Arranging Coins
  5. 【数据可视化应用】华夫饼型柱状图(附R语言代码)
  6. MATLAB从入门到精通-matlab计算多重复杂多边形重叠面积
  7. Python编程基础:第十三节 循环控制语句Loop Control Statements
  8. 计算机科学和机器学习中的代数学、拓扑学、微积分以及最优化理论
  9. 推荐业务多目标建模算法介绍:MMOE、OMOE、Shared-Bottom
  10. 写给开发向产品转型的同学的3句话