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) 被注释的元素必须符合正则表达式
相关推荐
疯一样的码农1 小时前
基于Spring Boot + Vue3实现的在线商品竞拍管理系统源码+文档
java·spring boot·后端
Y编程小白2 小时前
SpringBoot的pom.xml文件中,scope标签有几种配置?
xml·spring boot·后端
m0_748251352 小时前
【SpringBoot】日志文件
java·spring boot·spring
健康平安的活着3 小时前
springboot整合log4j2日志框架1
spring boot·后端·log4j
重整旗鼓~4 小时前
1.若依介绍
java·spring boot
我可能在扯淡4 小时前
解决springdoc-openapi-ui(Swagger3)跳转默认界面问题
java·spring boot
苹果酱05674 小时前
arm架构mysql_基于arm架构linux操作系统centos安装mysql5
java·spring boot·毕业设计·layui·课程设计
技术小泽4 小时前
代码思想之快慢路径
java·开发语言·spring boot·后端·设计规范
开心工作室_kaic4 小时前
springboot504基于Springboot网上蛋糕售卖店管理系统的设计与实现(论文+源码)_kaic
java·spring boot·后端
乄bluefox5 小时前
关于easy-es对时间范围查询遇到的小bug
java·数据库·spring boot·elasticsearch·搜索引擎·bug