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. 计划任务cmd 清理文件

    forfiles.exe /p D:\mysql-back /s /m * /d -30 /c "cmd /c del /q @path" #清理目录下创建大于30天所有类型的文件

  2. 二进制协议 vs 文本协议

    二进制协议 vs 文本协议 在服务器程序开发过程中,各个服务直接需要进行交互.这样就需要定义消息的协议,一般来说协议主要包括二进制协议和文本协议,下面就我在工作中用到的两种协议说说自己的看法. 1 二 ...

  3. [LeetCode] 285. Inorder Successor in BST_Medium tag: Inorder Traversal

    Given a binary search tree and a node in it, find the in-order successor of that node in the BST. No ...

  4. jquery.lazyload 使用

    1.引用js <script src="jquery.js" type="text/javascript"></script> < ...

  5. 关闭Oracle 11g的DPR特性

    关闭Oracle 11g的DPR(Direct Path Read)特性 查看event参数值: SQL> show parameter event NAME TYPE VALUE ------ ...

  6. 表单验证——JqueryValidator、BootstrapValidator

    表单验证两种方式: 1.JqueryValidator <!DOCTYPE html> <html lang="en"> <head> < ...

  7. mysql的Navicat查看数据库的ER图

    1.mysql数据库表间的关系图可以通过navicat查看.

  8. 兼容安卓和ios实现一键复制内容到剪切板

    实现代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <m ...

  9. mybatis例子

    mybatis的mapper不允许重载,因为它需要通过方法名称[不加签名]去查找需要执行的sql 1.批量删除 <delete id="deletePlanLocations" ...

  10. SQL Server报“GUID应包含带4个短划线的32位数”

    转自:http://www.seayee.net/article/info_106.html 最近在配置一台服务器的MS SQL Server 2005的维护计划自动备份数据库,能创建维护计划,但设置 ...