SpringBoot接口参数校验

1 前言

说起参数校验我们应该不陌生了,参数校验确保输入数据的完整性和一致性,防止无效或不合法的数据被传递到后端。那么你会如何对参数进行校验,使用if-else?这样不仅会造成代码冗余,我们写起来也麻烦。下面就来介绍使用SpringBoot Validation来优雅的对参数进行校验。

2 实现

2.1 引入依赖

xml 复制代码
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2.2 单个或多个参数校验

  • controler上添加Validated注解开启接口校验
  • 接口参数前使用校验注解(校验注解详情请看后面)
java 复制代码
package com.example.controller;

@RestController
@Validated
public class TestController {
    @PostMapping("/test1")
    public String test1(@Length(min = 3, max = 15) String username) {
        System.out.println(username);

        return "请求成功";
    }
}

2.3 对象校验

项目中POST请求经常会接收一个对象,那么该如何对一个对象进行校验呢?下面讲介绍

  • 提供对象,属性上添加校验规则
  • @Data注解是Lombok中的一个注解,它主要用于自动生成Java类的一些通用方法,如toString、equals、hashCode和所有字段的getter和setter方法
java 复制代码
package com.example.entity;

@Data
public class User {
    @Length(min = 3, max = 15)
    private String username;
    @Length(min = 3, max = 15)
    private String password;
}
  • controler上添加Validated注解开启接口校验,接口参数前使用Valid注解校验对象
java 复制代码
package com.example.controller;

@RestController
@Validated
public class TestController {
    PostMapping("/test2")
    public String test2(@Valid User user) {
        System.out.println(user);
        return "请求成功";
    }
}

2.4 异常处理

validation校验参数失败会抛出异常,响应格式与我们项目中响应的格式不同,因此需要处理抛出的异常,异常处理详情请看SpringBoot全局异常处理 - 掘金 (juejin.cn)

  • ConstraintViolationException:单个或多个参数校验失败
  • MethodArgumentNotValidException:对象参数校验失败
java 复制代码
package com.example.controller;

@RestControllerAdvice
@Slf4j
public class ProjectExceptionAdvice {
    @ExceptionHandler({ConstraintViolationException.class, MethodArgumentNotValidException.class})
    public String error(Exception e){
        log.info("请求参数异常!", e);

        return Result.fail(400, "请求参数异常!");
    }
}

3 校验注解

3.1 空值检查

注解 说明
@NotBlank 用于字符串,字符串不能为null 也不能为空字符串
@NotEmpty 字符串同上,对于集合(Map,List,Set)不能为空,必须有元素
@NotNull 不能为 null

3.2 数值检查

注解 说明
@DecimalMax(value) 被注释的元素必须为数字,其值必须小于等于指定的值
@DecimalMin(value) 被注释的元素必须为数字,其值必须大于等于指定的值
@Digits(integer, fraction) 被注释的元素必须为数字,其值的整数部分精度为 integer,小数部分精度为 fraction
@Positive 被注释的元素必须为正数
@PositiveOrZero 被注释的元素必须为正数或 0
@Max(value) 被注释的元素必须小于等于指定的值
@Min(value) 被注释的元素必须大于等于指定的值
@Negative 被注释的元素必须为负数
@NegativeOrZero 被注释的元素必须为负数或 0

3.3 Boolean 检查

注解 说明
@AssertFalse 被注释的元素必须值为 false
@AssertTrue 被注释的元素必须值为 true

3.4 长度检查

注解 说明
@Size(min,max) 被注释的元素长度必须在 min 和 max 之间,可以是 String、Collection、Map、数组

3.5 日期检查

注解 说明
@Future 被注释的元素必须是一个将来的日期
@FutureOrPresent 被注释的元素必须是现在或者将来的日期
@Past 被注释的元素必须是一个过去的日期
@PastOrPresent 被注释的元素必须是现在或者过去的日期

3.6 其他检查

注解 说明
@Email 被注释的元素必须是电子邮箱地址
@Pattern(regexp) 被注释的元素必须符合正则表达式
相关推荐
小马爱打代码28 分钟前
SpringBoot原生实现分布式MapReduce计算
spring boot·分布式·mapreduce
iuyou️31 分钟前
Spring Boot知识点详解
java·spring boot·后端
一弓虽43 分钟前
SpringBoot 学习
java·spring boot·后端·学习
来自星星的猫教授2 小时前
spring,spring boot, spring cloud三者区别
spring boot·spring·spring cloud
乌夷4 小时前
使用spring boot vue 上传mp4转码为dash并播放
vue.js·spring boot·dash
A阳俊yi5 小时前
Spring Boot日志配置
java·spring boot·后端
苹果酱05675 小时前
2020-06-23 暑期学习日更计划(机器学习入门之路(资源汇总)+概率论)
java·vue.js·spring boot·mysql·课程设计
斜月6 小时前
一个服务预约系统该如何设计?
spring boot·后端
Java水解6 小时前
线程池详解:在SpringBoot中的最佳实践
spring boot·后端
阿里小阿希7 小时前
解决 Spring Boot + MyBatis 项目迁移到 PostgreSQL 后的数据类型不匹配问题
spring boot·postgresql·mybatis