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) 被注释的元素必须符合正则表达式
相关推荐
麦兜*31 分钟前
MongoDB 常见错误解决方案:从连接失败到主从同步问题
java·数据库·spring boot·redis·mongodb·容器
爱吃烤鸡翅的酸菜鱼4 小时前
【Spring】原理解析:Spring Boot 自动配置
java·spring boot
十八旬4 小时前
苍穹外卖项目实战(day7-1)-缓存菜品和缓存套餐功能-记录实战教程、问题的解决方法以及完整代码
java·数据库·spring boot·redis·缓存·spring cache
郑洁文5 小时前
基于SpringBoot的天气预报系统的设计与实现
java·spring boot·后端·毕设
optimistic_chen5 小时前
【Java EE进阶 --- SpringBoot】Spring DI详解
spring boot·笔记·后端·spring·java-ee·mvc·di
中国胖子风清扬6 小时前
Rust 日志库完全指南:从入门到精通
spring boot·后端·rust·学习方法·logback
xiaogg36787 小时前
springboot rabbitmq 延时队列消息确认收货订单已完成
spring boot·rabbitmq·java-rabbitmq
麦兜*7 小时前
MongoDB 6.0 新特性解读:时间序列集合与加密查询
数据库·spring boot·mongodb·spring·spring cloud·系统架构
依稀i1237 小时前
Spring Boot + MySQL 创建超级管理员
spring boot·mysql
千里码aicood7 小时前
【springboot+vue】党员党建活动管理平台(源码+文档+调试+基础修改+答疑)
java·数据库·spring boot