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) 被注释的元素必须符合正则表达式
相关推荐
码语智行22 分钟前
系统启动时初始化数据功能分析
java·spring boot
invicinble25 分钟前
推荐一下,遇到的几本比较好的书
spring boot
憧憬成为java架构高手的小白1 小时前
git工作流程简化版
java·spring boot·git
YDS8293 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— 动态决策策略的接口对接
java·spring boot·ai·agent·spring ai·deepseek
淘源码A3 小时前
专科医院云HIS系统源码:技术栈包括SpringBoot、Angular、MySQL等
spring boot·后端·源码·云his·医院信息系统·医院his系统
小马爱打代码3 小时前
基于 SpringBoot 的微服务文件上传下载组件设计与实现
spring boot·后端
Java患者·5 小时前
Spring Boot 3 整合 Elasticsearch 8
spring boot·后端·elasticsearch
Mr.朱鹏5 小时前
基于 postgres_fdw 的跨库查询方案
java·数据库·spring boot·sql·spring·postgresql