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. UITextField输入中文

    [self.rightTF addTarget:self action:@selector(rightTFValueChange:) forControlEvents:UIControlEventEd ...

  2. POJ2485:Highways(模板题)

    http://poj.org/problem?id=2485 Description The island nation of Flatopia is perfectly flat. Unfortun ...

  3. pycharm进行调试[转载]

    转自:https://blog.csdn.net/william_hehe/article/details/80898031 1.首先设置断点. 2.Step into(F7):进入 若函数A内存在子 ...

  4. [LeetCode] 53. Maximum Subarray_Easy tag: Dynamic Programming

    Given an integer array nums, find the contiguous subarray (containing at least one number) which has ...

  5. 使用jmeter进行websocket协议压测

    第一步:添加websocket sampler组件 可以使用plugins manager进行添加,首先下载plugins manager组件: 下载路径:  https://jmeter-plugi ...

  6. 第一章SpringBoot入门

    一.简介 SpringBoot来简化Spring应用的开发,约定大于配置,去繁从简,just run就能创建一个独立的产品级别的应用. 背景: j2EE笨重的开发方法,繁多的配置,低下的开发效率,复杂 ...

  7. 【week6】团队贡献分

    小组名称:nice! 小组成员:李权 于淼 杨柳 刘芳芳 项目内容:约跑app 完成任务:   10% 20% 70% 好   于淼 李权 中   刘芳芳 杨柳 差       1.李权8.4 2.于 ...

  8. 2018-2019-2 20165209 《网络对抗技术》Exp5:MSF基础应用

    2018-2019-2 20165209 <网络对抗技术>Exp5:MSF基础应用 目录 一.基础问题回答和实验内容 二.攻击实例 主动攻击的实践 ms08_067 payload/gen ...

  9. Linux服务器---ssh登录

    Ssh登录     Ssh是建立在应用层和传输层的安全协议,专门为远程登录回话和其他网络服务提供安全性.利用ssh可以有效的防止远程管理中的信息泄露问题,同时ssh传输的数据是经过压缩的,可以加快传输 ...

  10. php header utf8 插入header("Content-type: text/html; charset=utf-8");

    PHP文件插入header("Content-type: text/html; charset=utf-8"); 相当于页面里面的<meta http-equiv=" ...