转自:

  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参数校验的更多相关文章

  1. SpringBoot Validation参数校验 详解自定义注解规则和分组校验

    前言 Hibernate Validator 是 Bean Validation 的参考实现 .Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint 的 ...

  2. springboot 接口参数校验

    前言 在开发接口的时候,参数校验是必不可少的.参数的类型,长度等规则,在开发初期都应该由产品经理或者技术负责人等来约定.如果不对入参做校验,很有可能会因为一些不合法的参数而导致系统出现异常. 上一篇文 ...

  3. 更加灵活的参数校验,Spring-boot自定义参数校验注解

    上文我们讨论了如何使用@Min.@Max等注解进行参数校验,主要是针对基本数据类型和级联对象进行参数校验的演示,但是在实际中我们往往需要更为复杂的校验规则,比如注册用户的密码和确认密码进行校验,这个时 ...

  4. springboot中参数校验

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

  5. SpringBoot_@valid_参数校验

    SpringBoot @valid 参数校验 空检查 @Null 验证对象是否为null @NotNull 验证对象是否不为null, 无法查检长度为0的字符串 @NotBlank 检查约束字符串是不 ...

  6. 补习系列(4)-springboot 参数校验详解

    目录 目标 一.PathVariable 校验 二.方法参数校验 三.表单对象校验 四.RequestBody 校验 五.自定义校验规则 六.异常拦截器 参考文档 目标 对于几种常见的入参方式,了解如 ...

  7. springboot 参数校验详解

    https://www.jianshu.com/p/89a675b7c900 在日常开发写rest接口时,接口参数校验这一部分是必须的,但是如果全部用代码去做,显得十分麻烦,spring也提供了这部分 ...

  8. 让Controller支持对平铺参数执行@Valid数据校验

    每篇一句 在金字塔塔尖的是实践,学而不思则罔,思而不学则殆(现在很多编程框架都只是教你碎片化的实践) 相关阅读 [小家Java]深入了解数据校验:Java Bean Validation 2.0(JS ...

  9. SpringBoot 参数校验的方法

    Introduction 有参数传递的地方都少不了参数校验.在web开发中,前端的参数校验是为了用户体验,后端的参数校验是为了安全.试想一下,如果在controller层中没有经过任何校验的参数通过s ...

随机推荐

  1. WIN7 32运行提示无法定位api-ms-win-crt-heap-l1-1-0.dll解决方法

    WIN7 32位无法运行adbapi-ms-win-crt-heap-l1-1-0.dll运行ADB ,提示无法定位api-ms-win-crt-heap-l1-1-0.dll需要安装https:// ...

  2. c++中的对象模型

    1 对象模型的前世 类在c++编译器内部可以理解成结构体,所以在对象模型分析时,我们可以把 class  当作一种特殊的 struct: 1)在内存中 class 可以看作是普通成员变量的集合: 2) ...

  3. python之数据驱动ddt操作(方法二)

    import unittestfrom ddt import ddt,unpack,datafrom selenium import webdriverfrom selenium.webdriver. ...

  4. Oracle19c 如何用rman duplicate 克隆一个数据库。(Backup-Based, achive log)

    Oracle19c 如何用rman duplicate 克隆一个数据库.(Backup-Based, achive log) 首先克隆有两种方法,一种是Backup-Based,一种是Active方式 ...

  5. Gitlab-500错误的恢复

    一.问题截图 二.定位问题 2.1.查看状态 # 查看状态 gitlab-ctl status # 如图发现gitaly 是down的状态 2.2.查看日志 # 查看日志 gitlab-ctl tai ...

  6. ODOO14 ---系统启动方式

    一.通过pycharm启动 1.配置启动面板: 点击启动即可: 第二种.通过CMD窗口启动:进入到odoo-bin的目录下,执行:python E:\odoo14\odoo14\odoo-bin  这 ...

  7. 第二篇 -- SpringBoot入门Helloworld

    之前讲Jmeter接口的时候讲过社区版怎么创建web接口,那么现在用企业版创建一个Springboot项目.企业版自带Springboot,新建起来更加简单. 第一步:新建一个项目 第二步:选择Spr ...

  8. Win10强制程序高DPI缩放设置

    起因 工作原因,需要在win10上安装数个古老vc版本(vc6,vc2008,vc2010),但是显示器是2K的,DPI缩放有问题 尝试 VC6比较好解决:右键,属性,兼容性,更改高DPI设置,勾选替 ...

  9. Android系统编程入门系列之界面Activity响应多元的属性动画

    在响应丝滑动画一篇文章中,分别介绍了作用于普通视图.绘制视图的绘制对象.和界面这三种对象的动画效果,但是都有一些使用的局限性.比如这些动画都只是以屏幕上绘制更新的方式绘制动画,并没有真实改变作用对象的 ...

  10. GC相关问题

    为什么会有新生代? 如果不分代,所有对象全部在一个区域,每次GC都需要对全堆进行扫描,存在效率问题.分代后,可分别控制回收频率,并采用不同的回收算法,确保GC性能全局最优. 为什么新生代会采用复制算法 ...