Springboot统一验证方式

在提供http api 接口形式的服务中,通过都会传递参数为一个对象。我们需要对这个对象的各个字段进行校验。来判断是否为合法值。

传统的方式为自己获取每个字段的值,自己写方法进行判断。

这种方式太过麻烦。

推荐使用

推荐使用 validation  通过其JSR303 Java 规范提案 的验证方法来进行验证。进行简化。

@Null     限制只能为null

@NotNull      限制必须不为null

@AssertFalse 限制必须为false

@AssertTrue  限制必须为true

@DecimalMax(value)    限制必须为一个不大于指定值的数字

@DecimalMin(value)    限制必须为一个不小于指定值的数字

@Digits(integer,fraction)      限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction

@Future 限制必须是一个将来的日期

@Max(value)  限制必须为一个不大于指定值的数字

@Min(value)  限制必须为一个不小于指定值的数字

@Past     限制必须是一个过去的日期

@Pattern(value)    限制必须符合指定的正则表达式

@Size(max,min)    限制字符长度必须在min到max之间

@Past     验证注解的元素值(日期类型)比当前时间早

@NotEmpty   验证注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0)

@NotBlank    验证注解的元素值不为空(不为null、去除首位空格后长度为0),不同于@NotEmpty,@NotBlank只应用于字符串且在比较时会去除字符串的空格

@Email   验证注解的元素值是Email,也可以通过正则表达式和flag指定自定义的email格式

如不满足还可以自定义验证注解。

使用方式:

public class user

{

@NotNull(message = "姓名不可为空")

private String name;

@DecimalMin(value = "100",message = "年龄必须大于100")

private Integer age;

}

public user create(@RequestBody @Valid user u) {}

这里有个问题,@Valid 如果有验证不通过的约束。将会抛出一个异常,这个异常将直接响应。

响应json结构:

{

"timestamp": 1554169655057,

"status": 400,

"error": "Bad Request",

"exception": "org.springframework.web.bind.MethodArgumentNotValidException",

"errors": [

{

"codes": [

"NotNull.user.name",

"NotNull.name",

"NotNull.java.lang.String",

"NotNull"

],

"arguments": [

{

"codes": [

"user.name",

"name"

],

"arguments": null,

"defaultMessage": "name",

"code": "name"

}

],

"defaultMessage": "姓名不可为空",

"objectName": "user",

"field": "name",

"rejectedValue": null,

"bindingFailure": false,

"code": "NotNull"

}

],

"message": "Validation failed for object='user'. Error count: 1",

"path": "/a"

}

这种方式在http api 的情况下非常不优化。

验证异常统一处理拦截器

我们可以提供自定义异常拦截器来实现对这个异常的补货,返回统一约定的响应结构体。

@ControllerAdvice

public class ExceptionControllerAdvice

{

/**

* 对验证约束异常进行拦截,返回约定的响应体

*/

@ExceptionHandler(MethodArgumentNotValidException.class)

@ResponseBody

public ResponseEntity bindExceptionHandler(MethodArgumentNotValidException ex)   {

BindingResult bindingResult = ex.getBindingResult();

List<ObjectError> errors = bindingResult.getAllErrors();

StringBuffer buffer = new StringBuffer();

for (ObjectError error : errors) {

buffer.append(error.getDefaultMessage()).append(" ");

}

return new ResponseEntity("403", buffer.toString());

}

/**

* 参数类型转换错误

*/

@ExceptionHandler(HttpMessageConversionException.class)

@ResponseBody

public ResponseEntity parameterTypeException(HttpMessageConversionException exception) {

return new ResponseEntity("403", exception.getCause().getLocalizedMessage());

}

}

这样我们就可以简化对请求参数的校验了。

Springboot统一参数验证方式的更多相关文章

  1. C# 中参数验证方式

    C# 中参数验证方式 一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空, ...

  2. C# 中参数验证方式的演变

    一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空,如果是字符可能有长度限 ...

  3. SpringBoot自定义参数验证器

    前要 之前我们介绍了JSR-303验证方式,十分的方便Spring都帮我们封装好了,但是对一些复杂的验证,还是需要更加灵活的验证器的. JSR-303验证器传送门:https://www.jiansh ...

  4. Java参数验证Bean Validation 框架

    1.为什么要做参数校验? 参数校验和业务逻辑代码分离,参数校验代码复用,统一参数校验方式.校验不太通过时统一异常描述. 2.bean validation规范 JSR303 规范(Bean Valid ...

  5. 使用validator-api来验证spring-boot的参数

    作为服务端开发,验证前端传入的参数的合法性是一个必不可少的步骤,但是验证参数是一个基本上是一个体力活,而且冗余代码繁多,也影响代码的可阅读性,所以有没有一个比较优雅的方式来解决这个问题? 这么简单的问 ...

  6. SpringBoot08 请求方式、参数获取注解、参数验证、前后台属性名不一致问题、自定义参数验证注解、BeanUtils的使用

    1 请求方式 在定义一个Rest接口时通常会利用GET.POST.PUT.DELETE来实现数据的增删改查:这几种方式有的需要传递参数,后台开发人员必须对接收到的参数进行参数验证来确保程序的健壮性 1 ...

  7. 【快学springboot】3.多种接受参数的方式

    前往掘金查看:https://juejin.im/post/5d05e5f9f265da1b6c5f74b4 前言 在开发中,我们常常会碰到多种传参的方式.这里,我们就来总结下,springboot中 ...

  8. SpringBoot整合Hibernate Validator实现参数验证功能

    在前后端分离的开发模式中,后端对前端传入的参数的校验成了必不可少的一个环节.但是在多参数的情况下,在controller层加上参数验证,会显得特别臃肿,并且会有许多的重复代码.这里可以引用Hibern ...

  9. 自动化CodeReview - ASP.NET Core请求参数验证

    自动化CodeReview系列目录 自动化CodeReview - ASP.NET Core依赖注入 自动化CodeReview - ASP.NET Core请求参数验证 参数验证实现 在做服务端开发 ...

随机推荐

  1. Java多线程面试、笔试方向---后续补充

    1.ThreadLocal类     线程级别的局部变量,为每个使用该变量的线程提供一个独立的变量副本,每个线程修改副本时不影响其他线程对象的副本.  ThreadLocal实例通常作为静态私有字段出 ...

  2. Java-SpringMvc-响应Html代码展示

    代码 @RequestMapping(value = "/test.do", method = {RequestMethod.GET}) public void test(Http ...

  3. Selenium定位元素-Xpath的使用方法

    工具 Xpath的练习建议下载火狐浏览器,下载插件Firebug.Firepath. 由于最新版火狐不支持Firebug等扩展工具了,所以需要下载49版以下的版本安装https://ftp.mozil ...

  4. Andrew Ng-ML习题答案1

    1.Linear Regression with Multiple Variables 转自:https://blog.csdn.net/mupengfei6688/article/details/5 ...

  5. 浅谈Android View事件分发机制

    引言 前面的文章介绍了View的基础知识和View的滑动,今天我们来介绍View的另一个核心知识,View的事件分发机制. 点击事件的传递规则 所谓的点击事件的分发机制,其实就是对MotionEven ...

  6. Web前端开发推荐阅读书籍、学习课程下载

    转自http://www.xuanfengge.com/fe-books.html 前言 学校里没有前端的课程,那如何学习JavaScript,又如何使自己成为一个合格的前端工程师呢? 除了在项目中学 ...

  7. 搭建Python3的jupyter notebook服务器

    摘要:搭建Python3 jupyter notebook. 激活Python3后,进入Python交互环境 1. 登陆远程服务器 2. 生成配置文件 1. $jupyter notebook --g ...

  8. VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)

    前面一节中鸡啄米为大家简单介绍了如何创建Ribbon样式的应用程序框架,本节教程就来初步讲讲怎样为Ribbon Bar添加Ribbon控件. VS2010为Ribbon界面开发提供了Ribbon De ...

  9. 圆的k次面积并

    搬运别人的 https://vjudge.net/problem/SPOJ-CIRUT //china no.1 #pragma comment(linker, "/STACK:102400 ...

  10. 公司里面用的iTextSharp(教程)---关于PDF的属性设置

    下面介绍下怎么添加属性,代码如下: protected void Button1_Click(object sender, EventArgs e) {   Document doc = new Do ...