Spring Boot 自动参数校验

news2026/2/22 6:35:31

在 Spring Boot 中实现参数自动校验主要依靠 Java Bean Validation API(JSR 380)和 Spring 的集成支持。以下是详细实现步骤:


1. 添加依赖

pom.xml 中添加验证依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2. 在实体类/DTO中添加校验注解

使用注解标记需要校验的字段:

public class UserDTO {
    @NotBlank(message = "用户名不能为空")
    private String username;

    @Email(message = "邮箱格式不正确")
    private String email;

    @Min(value = 18, message = "年龄必须大于18岁")
    private int age;

    @Pattern(regexp = "1[3-9]\\d{9}", message = "手机号格式不正确")
    private String phone;

    // Getter/Setter省略
}

常用校验注解

  • @NotNull:非 null
  • @NotBlank:非空(字符串)
  • @NotEmpty:非空集合/数组
  • @Min/@Max:数值范围
  • @Size:长度范围
  • @Email:邮箱格式
  • @Pattern:正则表达式

3. 在Controller中使用校验

在接收参数的请求方法中添加 @Valid@Validated

@PostMapping("/create")
public ResponseEntity<?> createUser(@Valid @RequestBody UserDTO userDTO) {
    // 校验通过后执行业务逻辑
    return ResponseEntity.ok("用户创建成功");
}

注意@Valid 是标准 JSR 注解,@Validated 是 Spring 的增强版(支持分组校验)。


4. 处理校验异常

添加全局异常处理器捕获校验失败异常:

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<Map<String, String>> handleValidationException(MethodArgumentNotValidException ex) {
        Map<String, String> errors = new HashMap<>();
        ex.getBindingResult().getFieldErrors().forEach(error -> {
            errors.put(error.getField(), error.getDefaultMessage());
        });
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errors);
    }
}

响应示例

{
    "username": "用户名不能为空",
    "email": "邮箱格式不正确"
}

5. 进阶用法

分组校验(不同场景不同规则)
  1. 定义分组接口:

    public interface CreateGroup {}
    public interface UpdateGroup {}
    
  2. 在 DTO 中指定分组:

    public class UserDTO {
        @NotNull(groups = UpdateGroup.class, message = "ID不能为空")
        private Long id;
    
        @NotBlank(groups = {CreateGroup.class, UpdateGroup.class})
        private String name;
    }
    
  3. Controller 指定分组:

    @PostMapping("/update")
    public void updateUser(@Validated(UpdateGroup.class) @RequestBody UserDTO dto) {
        // ...
    }
    
自定义校验注解
  1. 创建自定义注解:

    @Target({FIELD})
    @Retention(RUNTIME)
    @Constraint(validatedBy = PhoneValidator.class)
    public @interface ValidPhone {
        String message() default "手机号格式错误";
        Class<?>[] groups() default {};
        Class<? extends Payload>[] payload() default {};
    }
    
  2. 实现校验逻辑:

    public class PhoneValidator implements ConstraintValidator<ValidPhone, String> {
        @Override
        public boolean isValid(String phone, ConstraintValidatorContext context) {
            return phone != null && phone.matches("1[3-9]\\d{9}");
        }
    }
    

6. 测试校验

使用 Postman 或 curl 发送无效请求:

curl -X POST http://localhost:8080/create \
-H "Content-Type: application/json" \
-d '{"username":"", "email":"invalid-email"}'

将返回:

{
    "username": "用户名不能为空",
    "email": "邮箱格式不正确"
}

总结流程:

graph TD
    A[添加依赖] --> B[DTO添加校验注解]
    B --> C[Controller添加@Valid]
    C --> D[全局异常处理器]
    D --> E[返回错误信息]

通过以上步骤,Spring Boot 会自动完成参数校验,无需手动编写校验逻辑,大幅提升开发效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2401949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

破局新能源消纳难题!安科瑞智慧能源平台助力10KV配电网重构未来

一、政策驱动&#xff1a;新型配电网迎来 “智慧化” 刚需 随着分布式光伏、工商业储能、电动汽车充电桩等新型电力设施大规模并网&#xff0c;传统 10kV 配电网正面临 “高渗透、强波动、多交互” 的运行挑战。2025 年 6 月 1 日正式实施的《配电网通用技术导则》&#xff08;…

TIA博途中的程序导出为PDF格式的具体方法示例

TIA博途中的程序导出为PDF格式的具体方法示例 如下图所示&#xff0c;选中想要导出为PDF的程序块&#xff0c;右击选择“打印”&#xff0c; 如下图所示&#xff0c;选择“导出为WPS PDF” 或者“Microsoft Print to PDF”&#xff0c; 如下图所示&#xff0c;设置文档布局相关…

【大模型:知识图谱】--4.neo4j数据库管理(cypher语法1)

使用neo4j的cypher语法对图数据库进行管理&#xff1b;官网地址&#xff1a;Create, start, and stop databases - Operations Manual 目录 1.neo4j--简介 1.1.Neo4j版本的标准数据库 1.2.默认数据库 1.3.每用户主数据库 1.4.system数据库 2.neo4j--数据库管理 2.1.命名…

数字化时代养老机构运营实训室建设方案:养老机构运营沙盘实训模块设计

在数字化浪潮席卷各行各业的当下&#xff0c;养老机构运营实训室建设方案中的养老机构运营沙盘实训模块设计&#xff0c;已成为培养专业养老运营人才的关键环节&#xff0c;它需紧密贴合时代需求&#xff0c;构建兼具前瞻性与实用性的实训体系。点击获取实训室建设方案 一、养…

自由开发者计划 004:创建一个苹果手机长截屏小程序

一. 背景 年初&#xff0c;一个漂亮姐姐突然问我&#xff0c;iphone这么多年一直没法长截屏&#xff0c;你们程序员就没个办法把这个硬伤补上吗&#xff1f; 虎躯一震&#xff0c;脑瓜子嗡嗡的&#xff0c;这么多年的iphone资深用户&#xff0c;最初也不是没有想过这个问题&am…

工作流引擎-18-开源审批流项目之 plumdo-work 工作流,表单,报表结合的多模块系统

工作流引擎系列 工作流引擎-00-流程引擎概览 工作流引擎-01-Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎&#xff0c;支持现实世界的流程自动化需求 工作流引擎-02-BPM OA ERP 区别和联系 工作流引擎-03-聊一聊流程引擎 工作流引擎-04-流程引擎 activiti 优…

【虚拟机版本号】如果忘记了版本号,这样查找版本号

【虚拟机版本号】如果忘记了版本号&#xff0c;这样查找版本号 找到虚拟机的文件&#xff1a; 然后用记事本打开这个&#xff1a;.vmx文件 然后搜索.version

基于RK3568的多网多串电力能源1U机箱解决方案,支持B码,4G等

基于RK3568的多网多串电力能源1U机箱解决方案&#xff0c;结合B码对时和4G通信能力&#xff0c;可满足电力自动化、能源监控等场景的高可靠性需求。核心特性如下&#xff1a; 一、硬件配置 ‌处理器平台‌ 搭载RK3568四核Cortex-A55处理器&#xff0c;主频1.8GHz-2.0GHz&#…

面试题:Java多线程并发

继承 Thread 类 Thread 类本质上是实现了 Runnable 接口的一个实例&#xff0c;代表一个线程的实例。启动线程的唯一方法就是通过 Thread 类的 start()实例方法。start()方法是一个 native 方法&#xff0c;它将启动一个新线程&#xff0c;并执行 run()方法。 public class M…

2006-2020年各省用水总量数据

2006-2020年各省用水总量数据 1、时间&#xff1a;2006-2020年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;行政区划代码、地区名称、年份、用水总量 4、范围&#xff1a;31省 5、指标说明&#xff1a;用水总量是指一个国家或地区在一定时期内&#xff…

舵机在弹簧刀无人机中的作用是什么?

随着俄乌冲突的越发激烈&#xff0c;美国国防部宣布向乌克兰提供“弹簧刀”600型无人机。对于美国接连不断向乌克兰输送武器的做法&#xff0c;俄罗斯方面已经多次指责美国是在“火上浇油”&#xff0c;从而使俄乌冲突持续下去。 那么&#xff0c;弹簧刀究竟是一款怎样的无人机…

Git忽略规则.gitignore不生效解决

我在gitlab中新建了一个项目仓库&#xff0c;先把项目文件目录绑定到仓库&#xff0c;并全部文件都上传到了仓库中。 然后又从别的项目复制了忽略文件配置过来&#xff0c;怎么搞他都不能生效忽略我不要提交仓库的文件。 从网上查到说在本地仓库目录中&#xff0c;打开命…

6月5日day45

Tensorboard使用介绍 知识点回顾&#xff1a; tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战&#xff1a;MLP和CNN模型 效果展示如下&#xff0c;很适合拿去组会汇报撑页数&#xff1a; 作业&#xff1a;对resnet18在cifar10上采用微调策略下&a…

基于rpc框架Dubbo实现的微服务转发实战

目录 rpc微服务模块 导入依赖 配置dubbo 注解 开启Dubbo Dubbo的使用 特殊点 并没有使用 Reference 注入 微服务之间调用 可以选用Http 也可以Dubbo 我们 Dubbo 的实现需要一个注册中心 我作为一个服务的提供者 我需要把我的服务注册到注册中心去 调用方需要注册中心…

深度学习N2周:构建词典

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 本周任务&#xff1a;使用N1周的.txt文件构建词典&#xff0c;停用词请自定义 1.导入数据 from torchtext.vocab import build_vocab_from_iterator from co…

贪心算法应用:装箱问题(FFD问题)详解

贪心算法应用&#xff1a;装箱问题(FFD问题)详解 1. 装箱问题概述 装箱问题(Bin Packing Problem)是计算机科学和运筹学中的一个经典组合优化问题。问题的描述如下&#xff1a; 给定一组物品&#xff0c;每个物品有一定的体积&#xff0c;以及若干容量相同的箱子&#xff0c…

操作系统学习(九)——存储系统

一、存储系统 在操作系统中&#xff0c;存储系统&#xff08;Storage System&#xff09; 是计算机系统的核心组成部分之一&#xff0c;它负责数据的存储、组织、管理和访问。 它不仅包括物理设备&#xff08;如内存、硬盘&#xff09;&#xff0c;还包括操作系统提供的逻辑抽…

服务器安装软件失败或缺依赖怎么办?

服务器在安装软件时失败或提示缺少依赖&#xff0c;是运维中非常常见的问题。这个问题大多发生在 Linux 云服务器环境&#xff0c;原因和解决方法也有共性。以下是详细说明和解决建议&#xff1a; &#x1f9e0; 一、常见原因分析 问题类型描述&#x1f50c; 软件源不可用服务器…

006网上订餐系统技术解析:打造高效便捷的餐饮服务平台

网上订餐系统技术解析&#xff1a;打造高效便捷的餐饮服务平台 在数字化生活方式普及的当下&#xff0c;网上订餐系统成为连接餐饮商家与消费者的重要桥梁。该系统以菜品分类、订单管理等模块为核心&#xff0c;通过前台展示与后台录入的分工协作&#xff0c;为管理员和会员提…

[10-2]MPU6050简介 江协科技学习笔记(22个知识点)

1 2 3 欧拉角是描述三维空间中刚体或坐标系之间相对旋转的一种方法。它们由三个角度组成&#xff0c;通常表示为&#xff1a; • 偏航角&#xff08;Yaw&#xff09;&#xff1a;绕垂直轴&#xff08;通常是z轴&#xff09;的旋转&#xff0c;表示偏航方向的变化。 • 俯仰角&a…