【springboot】@Valid参数校验
转自:
https://blog.csdn.net/cp026la/article/details/86495659
扯淡:
刚开始写代码的时候对参数的校验要么不做、要么写很多类似 if( xx == null){ … }的语句,总想参数校验可以交给前端处理(很机智),服务端对参数的校验同样重要。
参数校验:
springboot需要引入spring-boot-starter-validation(使用Hibernate Validator 框架提供验证功能) 依赖进行参数校验,由于本项目中已经引入了spring-boot-starter-web 依赖(包含spring-boot-starter-validation依赖),就不需要重复引用了。
1、基本注解介绍:
@NotEmpty:作用在String、collection、map、数组上,不能为null,size > 0
@NotBlank: 只能用于String,不能为null,也不可以是" ",即trim()后长度大于0
@@NotNull:作用于任何类型,不能为null,可以为空
@AssertTrue:必须为true
@AssertFalse:必须为false
@Min(value):必须为一个数字,且值大于等于指定的值
@Max(value):必须为一个数字,且值小于等于指定的值
@Size(max,min):限制参数大小范围
@Future:必须是一个将来的日期
@Past:必须是一个过去的日期
@Pattern(value):指定正则
2、实体类:
/**
* @Auther: xf
* @Date: 2018/11/01 23:27
* @Description:
*/
@Data
public class ValidEntity { @NotBlank(message = "name不可以为空")
@Size(min = 2,max = 4,message = "name的长度范围为2-4")
private String name; @NotNull(message = "age 不能为null")
@Min(value = 0, message = "age 最小值不能小于0")
private int age; }
3、测试Controller:
/**
* @Auther: xf
* @Date: 2018/11/01 23:35
* @Description: 测试参数校验
*/
@RestController
@Slf4j
public class TestValidController { @PostMapping(value = "/valid")
public ApiResult valid(@Valid @RequestBody ValidEntity validEntity) {
log.info(">>>>实体类信息为:>>>>{}", JSON.toJSONString(validEntity));
return ApiResult.ok(validEntity);
}
}
4、测试结果:
此处为POST请求,使用Postman:
4.1、正确传参(此处为JSON格式的参数)返回结果正确。
4.2、错误传参 错误响应信息

错误日志:

5、注意:
此处的日志很显然是统一异常处理类GlobalExceptionHandler中的日志,即参数校验不通过的时候走到了统一异常处理类中了。这里返回了所有的异常信息,显得不优雅,我们可以在统一异常处理类中断点调试得到该JSON格式错误的参数校验不通过是使用的MethodArgumentNotValidException 返回的。

6、当我将请求参数的@RequestBody 去掉后:
@PostMapping(value = "/valid")
public ApiResult valid(@Valid ValidEntity validEntity) {
log.info(">>>>实体类信息为:>>>>{}", JSON.toJSONString(validEntity));
return ApiResult.ok(validEntity);
}
再次请求:

断点调试得到的是BindException

于是,我们可以在统一异常处理类中添加这两个异常的处理方法,当然也可以在原来的Exception 处理中去做判断,这里分别添加这两个异常的处理。
7、修改原来的全局异常处理类:
@RestControllerAdvice(annotations = {RestController.class})
@Slf4j
public class GlobalExceptionHandler {
    /**
     * 默认统一异常处理方法
     * @ExceptionHandler 注解用来配置需要拦截的异常类型, 也可以是自定义异常
     */
    @ExceptionHandler(Exception.class)
    // 此处可以指定返回的状态码 和 返回 结果说明
    // @ResponseStatus(reason = "exception",value = HttpStatus.BAD_REQUEST)
    public Object runtimeExceptionHandler(Exception e) {
        // 打印异常信息到控制台
        e.printStackTrace();
        log.error("请求出现异常,异常信息为: {}", e.getMessage());
        // 使用公共的结果类封装返回结果, 这里我指定状态码为 400
        return ApiResult.build(400, e.getMessage());
    }
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ApiResult handleBindException(MethodArgumentNotValidException ex) {
        FieldError fieldError = ex.getBindingResult().getFieldError();
        log.info("参数校验异常:{}({})", fieldError.getDefaultMessage(),fieldError.getField());
        return ApiResult.build(400, fieldError.getDefaultMessage());
    }
    @ExceptionHandler(BindException.class)
    public ApiResult handleBindException(BindException ex) {
        FieldError fieldError = ex.getBindingResult().getFieldError();
        log.info("参数校验异常:{}({})", fieldError.getDefaultMessage(),fieldError.getField());
        return ApiResult.build(400, fieldError.getDefaultMessage());
    }
} 
至此参数校验配置完毕。
【springboot】@Valid参数校验的更多相关文章
- SpringBoot Validation参数校验 详解自定义注解规则和分组校验
		前言 Hibernate Validator 是 Bean Validation 的参考实现 .Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的 ... 
- springboot 接口参数校验
		前言 在开发接口的时候,参数校验是必不可少的.参数的类型,长度等规则,在开发初期都应该由产品经理或者技术负责人等来约定.如果不对入参做校验,很有可能会因为一些不合法的参数而导致系统出现异常. 上一篇文 ... 
- 更加灵活的参数校验,Spring-boot自定义参数校验注解
		上文我们讨论了如何使用@Min.@Max等注解进行参数校验,主要是针对基本数据类型和级联对象进行参数校验的演示,但是在实际中我们往往需要更为复杂的校验规则,比如注册用户的密码和确认密码进行校验,这个时 ... 
- springboot中参数校验
		<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring- ... 
- SpringBoot_@valid_参数校验
		SpringBoot @valid 参数校验 空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null, 无法查检长度为0的字符串 @NotBlank 检查约束字符串是不 ... 
- 补习系列(4)-springboot 参数校验详解
		目录 目标 一.PathVariable 校验 二.方法参数校验 三.表单对象校验 四.RequestBody 校验 五.自定义校验规则 六.异常拦截器 参考文档 目标 对于几种常见的入参方式,了解如 ... 
- springboot 参数校验详解
		https://www.jianshu.com/p/89a675b7c900 在日常开发写rest接口时,接口参数校验这一部分是必须的,但是如果全部用代码去做,显得十分麻烦,spring也提供了这部分 ... 
- 让Controller支持对平铺参数执行@Valid数据校验
		每篇一句 在金字塔塔尖的是实践,学而不思则罔,思而不学则殆(现在很多编程框架都只是教你碎片化的实践) 相关阅读 [小家Java]深入了解数据校验:Java Bean Validation 2.0(JS ... 
- SpringBoot 参数校验的方法
		Introduction 有参数传递的地方都少不了参数校验.在web开发中,前端的参数校验是为了用户体验,后端的参数校验是为了安全.试想一下,如果在controller层中没有经过任何校验的参数通过s ... 
随机推荐
- C语言:赋值
			#include <stdio.h> //=赋值运算符 //具有方向性,只能将赋值号右边的表达式的值给左边的变量 //赋值语句具有计算功能,赋值号右边可以是常量,变量或表达式都可以 //赋 ... 
- python pandas inplace参数
			'''pandas 中 inplace 参数在很多函数中都会有,它的作用是:是否在原对象基础上进行修改  inplace = True:不创建新的对象,直接对原始对象进行修改:  inplace ... 
- Linux从入门到进阶全集——【第十五集:安装apache服务器】
			1,查看是否安装了httpd软件包以及其依赖:rpm -qa httpd(rpm -qa | grep httpd),如果没有输出任何信息,表示你没有安装httpd软件包,如果有输出一般是已经安装了: ... 
- 最大网络流dinic
			初始化flow(最大流量)为INF(极大值),建边(正向弧和反向弧) bfs寻找增广路看看有没有路,顺便进行深度标号.如果没有路直接结束输出flow. 如果有,我们按照深度dfs.dfs时注意在给正向 ... 
- javascript学习(二)--函数
			一.在JavaScript中,定义函数的方式如下: 1.第一种方式: function abs(x) { if (x >= 0) { return x; } else { return -x; ... 
- macOS下将可执行文件索引位置增添到PATH中
			一.shell中可执行文件的两种执行方式 (1)绝对路径 比如,打开电脑上安装的python3,使用绝对路径方式打开为: /usr/local/bin/python3 (2)使用PATH 将pytho ... 
- 如何使用SQL Server实现SignalR的横向扩展
			一般来说,Web应用的扩展有两种:scale up(纵向扩展)和scale out(横向扩展). 1.纵向扩展 使用配置高(大内存,多处理器)的服务器或者虚拟机. 2.横向扩展 使用多个服务器(Web ... 
- 小技巧 | Get 到一个 Web 自动化方案,绝了!
			1. 前言 大家好,我是安果! 无论是 Chrome,还是 Firefox 浏览器,它们的强大性在很大程度上都是依赖于海量的插件,让我们能高效办公 那我们是否可以编写一个插件,让浏览器自动化完成一些日 ... 
- SQL SERVER获取某张表创建的索引
			1 SELECT 索引名称=a.name 2 ,表名=c.name 3 ,索引字段名=d.name 4 ,索引字段位置=d.colid 5 FROM sysindexes a 6 JOIN sysin ... 
- 遥远的国度 (树链剖分换根),洛谷P3979
			析:显然,若没有换根操作,则为树链剖分板子题,但是这道题我们考虑换根操作 考虑这样一个性质:在一棵树上,两点的距离路径是唯一的!! 也就是说,我们在修改路径上的点权时,不必考虑根在哪里,直接利用模板修 ... 
