使用Spring Validation实现数据校验详解

目录

  • 前言
  • 1. Spring Validation概述
  • 2. 配置Spring Validation
    • 2.1 引入依赖
    • 2.2 启用全局校验
  • 3. 使用注解进行参数校验
    • 3.1 基本校验注解
    • 3.2 使用@Pattern进行正则校验
    • 3.3 综合示例
  • 4. 在控制器层应用校验
    • 4.1 方法参数校验
    • 4.2 自定义错误处理
  • 5. 高级应用:自定义校验注解
    • 5.1 定义自定义注解
    • 5.2 创建校验器
    • 5.3 使用自定义注解
  • 6. 总结

前言

在现代Web应用开发中,数据校验是不可忽视的重要环节。Spring提供了强大的数据校验框架——Spring Validation,可以有效提升数据输入的安全性与应用的稳定性。本文将介绍如何使用Spring Validation进行数据校验,从依赖引入、注解使用到完整示例,帮助您深入理解和灵活应用这一技术。
在这里插入图片描述

1. Spring Validation概述

数据校验是保证应用程序数据安全和稳定运行的基础。Spring Validation基于Java Bean Validation框架,实现了灵活且便捷的校验机制。通过一系列注解,我们可以轻松地对数据进行格式、长度、范围等校验,同时减少冗余代码,提升代码的可维护性。
在这里插入图片描述

2. 配置Spring Validation

要在Spring Boot项目中启用Spring Validation,需要进行依赖引入和基本配置。

2.1 引入依赖

在Spring Boot项目中,可以通过spring-boot-starter-validation依赖包来实现数据校验功能。该依赖包含了Bean Validation API和Hibernate Validator,后者是最常用的Bean Validation实现。

pom.xml文件中添加以下依赖:

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

引入依赖后,Spring Boot会自动配置Validation功能。

2.2 启用全局校验

Spring Validation可以在多个层次进行应用:控制器层、服务层和数据层。通常推荐在控制器层对数据进行校验,以尽早发现错误并返回用户友好的提示信息。要启用校验功能,可以在控制器类上使用@Validated注解。

例如,在控制器类上添加如下代码:

@RestController
@Validated
public class UserController {// 控制器逻辑
}

添加@Validated注解后,控制器方法中的参数就可以被校验框架识别和处理。

3. 使用注解进行参数校验

Spring Validation支持多种校验注解,如@NotNull@Size@Pattern等。这些注解可以直接应用于控制器方法参数、请求体中的字段或实体类的属性上,确保数据符合预期格式。

3.1 基本校验注解

以下是常用的校验注解介绍:

  • @NotNull:确保字段不为空。例如,用户注册时用户名不能为空。
  • @Size:限制字符串、数组等集合的长度或数量。例如,密码长度限制在8到20个字符之间。
  • @Pattern:通过正则表达式校验字段格式。例如,验证邮箱格式、手机号格式等。

3.2 使用@Pattern进行正则校验

@Pattern注解通过正则表达式来校验字段的格式,可以用于校验手机号、邮箱、密码复杂性等场景。以下是一个使用@Pattern校验手机号格式的示例:

public class User {@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")private String phoneNumber;// 其他字段和方法
}

在此示例中,regexp属性指定了手机号的正则表达式,而message属性定义了校验失败时返回的提示信息。

3.3 综合示例

在用户注册表单中,通常会涉及多个字段的校验需求。以下代码演示了如何在User类中综合应用多个校验注解:

public class User {@NotNull(message = "用户名不能为空")private String username;@Size(min = 8, max = 20, message = "密码长度应在8到20位之间")private String password;@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")private String phoneNumber;@Email(message = "邮箱格式不正确")private String email;// Getters和Setters方法
}

在此类中,username不能为空,password长度必须符合要求,phoneNumber必须符合手机号格式,而email则必须是合法的邮箱地址。

4. 在控制器层应用校验

在实际开发中,我们通常在控制器层对数据进行校验,以便在接收请求时进行参数检查并及时返回校验错误信息。要实现这一点,可以使用@Valid@Validated注解配合@RequestBody`注解进行参数绑定和校验。

4.1 方法参数校验

在控制器方法中,可以直接将需要校验的对象作为参数,并添加@Valid注解。当请求中的数据不符合约定的格式时,Spring会自动抛出MethodArgumentNotValidException异常。

@PostMapping("/register")
public ResponseEntity<String> registerUser(@Valid @RequestBody User user) {// 注册逻辑return ResponseEntity.ok("注册成功");
}

当校验不通过时,Spring会将校验错误自动包装在BindingResult中,我们可以通过捕获这些错误来返回具体的错误信息。

4.2 自定义错误处理

可以通过编写一个全局异常处理器来处理校验失败的情况。下面是一个示例,展示了如何在控制器层捕获并处理校验异常:

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<Map<String, String>> handleValidationExceptions(MethodArgumentNotValidException ex) {Map<String, String> errors = new HashMap<>();ex.getBindingResult().getAllErrors().forEach(error -> {String fieldName = ((FieldError) error).getField();String errorMessage = error.getDefaultMessage();errors.put(fieldName, errorMessage);});return ResponseEntity.badRequest().body(errors);}
}

此全局异常处理器捕获了MethodArgumentNotValidException异常,并将每个字段的错误信息返回给前端,以便用户及时进行修改。

5. 高级应用:自定义校验注解

Spring Validation还支持自定义校验注解,用于实现更复杂或个性化的校验需求。自定义注解通常包括三个部分:注解定义、校验器类和注解应用。

5.1 定义自定义注解

例如,我们可以定义一个校验年龄的注解@ValidAge,确保用户年龄在18至60岁之间:

@Target({ ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = AgeValidator.class)
public @interface ValidAge {String message() default "年龄必须在18至60岁之间";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}

5.2 创建校验器

校验器实现ConstraintValidator接口,在isValid方法中定义具体的校验逻辑:

public class AgeValidator implements ConstraintValidator<ValidAge, Integer> {@Overridepublic void initialize(ValidAge constraintAnnotation) {}@Overridepublic boolean isValid(Integer age, ConstraintValidatorContext context) {return age != null && age >= 18 && age <= 60;}
}

5.3 使用自定义注解

User类中,可以通过@ValidAge注解来校验用户的年龄是否符合要求:

public class User {@ValidAgeprivate Integer age;// 其他字段和方法
}

6. 总结

Spring Validation提供了灵活、丰富的校验机制,适用于数据输入安全要求较高的场景。在本文中,我们详细介绍了Spring Validation的配置、注解使用和自定义注解的实现。通过结合实际应用示例,您可以根据需求灵活调整校验规则,为用户提供更加安全友好的数据交互体验。

Spring Validation不仅能减少手动校验代码量,提升应用安全性,还能通过简洁的注解语法提高代码的可读性和可维护性。在实际开发中,掌握并灵活使用Spring Validation将为您的项目带来更高的开发效率和更好的用户体验。

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

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

相关文章

链表(C 语言)

目录 一、链表的概念1. 链表的结构2. 链表的分类3. 链表的优势 二、链表的实现1. 无头单项非循环链表的实现1.1 代码说明 2. 带头双向循环链表的实现2.1 代码说明 三、链表和顺序表的区别四、链表总结 一、链表的概念 链表是一种顺序表&#xff0c;它由一个一个的节点组成&…

QinQ的基础实验

拓扑 命令 LSW1 [LSW1]vlan batch 2 3 4 Info: This operation may take a few seconds. Please wait for a moment...done. [LSW1]interface g0/0/1 [LSW1-GigabitEthernet0/0/1]port link-type hybrid [LSW1-GigabitEthernet0/0/1]port hybrid untagged vlan 2 3 [LSW…

python-读写Excel:openpyxl-(4)下拉选项设置

使用openpyxl库的DataValidation对象方法可添加下拉选择列表。 DataValidation参数说明&#xff1a; type&#xff1a; 数据类型("whole", "decimal", "list", "date", "time", "textLength", "custom"…

Elasticsearch中时间字段格式用法详解

Elasticsearch中时间字段格式用法详解 攻城狮Jozz关注IP属地: 北京 2024.03.18 16:27:51字数 758阅读 2,571 Elasticsearch&#xff08;简称ES&#xff09;是一个基于Lucene构建的开源、分布式、RESTful搜索引擎。它提供了全文搜索、结构化搜索以及分析等功能&#xff0c;广泛…

【JavaEE初阶 — 多线程】Thread的常见构造方法&属性

目录 Thread类的属性 1.Thread 的常见构造方法 2.Thread 的几个常见属性 2.1 前台线程与后台线程 2.2 setDaemon() 2.3 isAlive() Thread类的属性 Thread 类是JVM 用来管理线程的一个类&#xff0c;换句话说&#xff0c;每个线程都有一个唯一的Thread 对象与之关联&am…

论文阅读笔记:DRCT: Saving Image Super-Resolution away from Information Bottleneck

论文阅读笔记&#xff1a;DRCT: Saving Image Super-Resolution away from Information Bottleneck 1 背景1.1 问题1.2 本文提出的方法 2 创新点3 方法4 模块4.1 问题描述4.2 深度特征提取模块4.3 同任务渐进式训练策略 5 效果5.1 和SOTA方法对比 论文&#xff1a;https://arxi…

数据结构 —— 红黑树

目录 1. 初识红黑树 1.1 红黑树的概念 1.2 红⿊树的规则 1.3 红黑树如何确保最长路径不超过最短路径的2倍 1.4 红黑树的效率:O(logN) 2. 红黑树的实现 2.1 红黑树的基础结构框架 2.2 红黑树的插⼊ 2.2.1 情况1&#xff1a;变色 2.2.2 情况2&#xff1a;单旋变色 2.2…

健身房数字化转型:SpringBoot管理系统

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

字符串相乘(全网最快0ms方法)

一&#xff1a;题目 二&#xff1a;思路 解释&#xff1a;每次相乘的结果不进位直接放进同一个数组里&#xff0c;相同位置则新放进的结果即可&#xff0c;最后得到左图的数组&#xff0c;再对其进行进位&#xff0c;得到正确的结果 Q1&#xff1a;数组的大小取多少&#xff1…

虚拟展厅和实景复刻有什么区别?应用场景和优势有哪些?

虚拟展厅和实景复刻在展览展示领域均扮演着重要角色&#xff0c;但二者之间存在显著的差异。以下是对这两者的详细比较&#xff1a; 一、定义与构建方式 虚拟展厅 虚拟展厅是利用数字技术和三维建模技术创建的虚拟展览环境&#xff0c;使参观者可以通过计算机、智能手机等设…

如何删除react项目的默认图标,使在浏览器中不显示默认图标favicon.ico

要删除 React 项目的默认图标&#xff0c;使在浏览器中不显示默认图标favicon.ico&#xff0c;其实有两种方法&#xff1a; 方法一 方法要点&#xff1a;删除掉 public 目录下的 favicon.ico 文件&#xff0c;再用浏览器访问时&#xff0c;如果加载不到图标文件&#xff0c;就…

计算机网络——路由器构成

算路由表是分布式去算——你算你的&#xff0c;我算我的 输出队列非先来先传 调度发生在哪里 缓存队列一般是应对——来数据方向的速度过快问题

项目活动进度计算题

六个时间参数①最早开始时间ESmax{紧前工作最早完成时间EF}&#xff08;紧前取大&#xff09; 最早完成时间EFES工期&#xff0c;从左→右计算&#xff0c;累加取大 ②最迟完成时间LFmin{紧后工作最迟开始时间LS}&#xff08;紧后取小&#xff09; 最迟开始时间LSLF-工期&am…

练习LabVIEW第四十题

学习目标&#xff1a; 用labvIEW做一个循环闪烁指示灯&#xff0c;要能够在前面板调节周期和占空比。 开始编写&#xff1a; 前面板 一个布尔指示灯一维数组&#xff0c;两个数值输入控件&#xff1b; 程序框图 添加一个while循环&#xff0c;循环内添加初始化数组&…

工商业储能是什么,工商业储能有什么作用?

随着全球能源结构的转型和“双碳”目标的推进&#xff0c;工商业储能系统作为新型电力系统的重要组成部分&#xff0c;正逐渐成为能源管理和电力市场的关键力量。工商业储能系统通过削峰填谷、需量管理、电力现货交易等多种方式&#xff0c;不仅能够有效降低企业的用电成本&…

DApp开发定制:合约设计与源码搭建支持快速上线

随着区块链技术的飞速发展&#xff0c;去中心化应用&#xff08;DApp&#xff09;已经成为区块链生态中不可或缺的一部分。DApp不仅改变了传统互联网应用的运作方式&#xff0c;还通过去中心化的理念和智能合约的支持&#xff0c;赋能了用户和开发者。无论是金融、游戏、社交、…

ssm+vue683基于VUE.js的在线教育系统设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm 等开发框架&#xff09; vue .net php phython node.js uniapp 微信小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不…

多商户电商平台开发指南:基于直播带货系统源码的搭建方案详解

本篇文章&#xff0c;小编将详细解析如何利用直播带货系统源码&#xff0c;快速搭建一套多商户电商平台的解决方案。 一、直播带货系统在多商户电商平台中的应用价值 在多商户电商平台中&#xff0c;直播带货系统可以帮助商家&#xff1a; 1.增加用户互动 2.提升转化率 3.…

登录功能设计(php+mysql)

一 登录功能 1. 创建一个登录页面&#xff08;login.php&#xff09;&#xff0c;包含一个表单&#xff0c;用户输入用户名和密码。 2. 在表单的提交事件中&#xff0c;使用PHP代码处理用户输入的用户名和密码。 3. 首先&#xff0c;连接MySQL数据库。然后&a…

P3-1.【结构化程序设计】第一节——知识要点:算法、顺序结构程序设计、if语句的语法结构及各种用法

讲解视频&#xff1a; P3-1.【结构化程序设计】第一节——知识要点&#xff1a;算法、顺序结构程序设计、if语句的语法结构及各种用法 知识要点&#xff1a;算法、顺序结构程序设计、if语句的语法结构及各种用法 一、算法、顺序结构程序设计任务分析 知识要点&#xff1a;算法…