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. [py][mx]operation模型设计

    用户表 UserMesasage 用户消息 UserFavorite 用户收藏 UserAsk 用户咨询 UserCourse 用户学习的课程 CourseComments 用户评论 收藏有3种类型 ...

  2. node初识——node中的require方法与require.js的区别

    出处:http://blog.csdn.net/u013613428/article/details/51966500 作为一个前端的新手,总是诧异于js的模块载入方式,看到了通过requireJs提 ...

  3. Qt 布局管理器

    在一个颜值当道的今天,无论买衣服,买车还是追星,颜值的高低已经变成了大家最看重的(不管男性女性都一样,千万别和我说你不是):而对于程序猿来说,开发一款软件,不再只注重逻辑和稳定性,美观和用户友好性也是 ...

  4. Ants-穷举算法

    package java操作excel; import java.util.Scanner; /** * Ants * n只蚂蚁以每秒1cm的速度在长为Lcm的竿子上爬行,当蚂蚁爬到端点就会掉下去,竿 ...

  5. vmware tool安装

    https://www.vmware.com/support/ws55/doc/ws_newguest_tools_linux.html VMware Workstation 5.5 Features ...

  6. Java事件监听的四种实现方式

    1.事件对象: 一般继承自java.util.EventObject对象,由开发者自行定义. 2.事件源: 就是触发事件的源头,不同的事件源会触发不同的事件类型. 3.事件监听器: 事件监听器负责监听 ...

  7. SQL查询日历

    这东西给自己留着用. 经常会用到一些查询需要做全月统计,但有些时候的统计需要将未发生日期也显示出来,因此会需要一个固定的日期表,(T6的自定义查询估计也是需要的,至少以前是这样) 下面写两种方法来获取 ...

  8. 俞敏洪:未来教育是互联网+ AI +区块链联合颠覆

    “我对面向未来教育领域,内心是有一丝悲哀的.至少在我思考和理解的范围内,互联网和 AI 是不是有可能彻底的改变中国教育现状?我没有想清楚.”10 月 31 日,在鲸媒体举办的以“教育 +AI”为的主题 ...

  9. PHP多进程处理并行处理任务实例(转,备用)

    本文目的本文通过例子讲解linux环境下,使用php进行并发任务处理,以及如何通过pipe用于进程间的数据同步.PHP多进程通过pcntl_XXX系列函数使用多进程功能.注意:pcntl_XXX只能运 ...

  10. java反射之-性能优化

    在最近的计划中,打算看看在不使用google protobuf的情况下,在原有的采用jackson作为json序列化工具的基础上,是否可以实现进一步的性能优化.主要是针对list的情况. 测试的时候选 ...