【Java 中级】一文精通 Spring MVC - 数据验证(七)

👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主
⛪️ 个人社区:个人社区
💞 个人主页:个人主页
🙉 专栏地址: ✅ Java 高阶
🙉八股文专题:剑指大厂,手撕 Java 八股文
文章目录
- 1. 什么是数据验证
- 2. 数据验证的应用场景
- 3. SpringMVC @Validator 使用方法
- 4. SpringMVC 自定义数据验证案例
1. 什么是数据验证
SpringMVC 数据验证是指在 SpringMVC 框架中对用户提交的数据进行验证,确保数据的合法性和有效性。通过数据验证,可以防止无效或恶意的数据进入系统,提高系统的安全性和稳定性。以下是 SpringMVC 数据验证的相关内容:
注解驱动验证:SpringMVC 提供了一系列的注解,如 @NotNull、@NotEmpty、@Min、@Max 等,用于对请求参数进行验证。可以将这些注解应用到控制器方法的参数上,或者在实体类的属性上进行验证。
示例:
@RequestMapping("/example")
public String example(@NotNull @Min(18) Integer age, @NotEmpty String name) {// 验证年龄不为空且大于等于18,姓名不为空// 处理业务逻辑return "example";
}
自定义验证器:除了使用注解进行验证外,还可以创建自定义的验证器来实现更复杂的验证逻辑。自定义验证器需要实现 Spring 的 Validator 接口,并在控制器方法或配置文件中进行注册。
通过以上方式,SpringMVC 可以方便地进行数据验证,确保数据的合法性和有效性。这有助于提高系统的安全性和可靠性。
2. 数据验证的应用场景
数据验证的应用场景广泛,适用于各种需要确保数据合法性和有效性的场景。以下是一些常见的数据验证应用场景:
-
表单验证:在用户提交表单数据时,验证输入的数据是否符合要求。例如,验证必填字段是否为空、验证邮箱格式是否正确、验证密码是否符合规定的复杂度等。 -
数据库操作:在进行数据库操作之前,对数据进行验证,以确保数据的完整性和一致性。例如,验证外键关联是否存在、验证唯一约束是否满足等。 -
API 接口验证:在接收到外部请求时,对请求参数进行验证,以确保请求的合法性和安全性。例如,验证请求参数的类型和范围、验证请求头信息是否正确等。 -
身份验证:在用户登录或访问敏感信息时,对用户身份进行验证,以确保用户的合法性和权限。例如,验证用户名和密码是否匹配、验证访问令牌是否有效等。 -
数据转换和格式化:在将数据从一种格式转换为另一种格式时,进行数据验证,以确保转换的准确性和有效性。例如,将字符串转换为日期对象时,验证字符串是否符合日期格式。 -
业务规则验证:根据业务需求,对数据进行特定的验证。例如,验证订单金额是否超过用户账户余额、验证商品库存是否足够等。
数据验证在应用开发中扮演着重要的角色,可以保证数据的质量和一致性,提高系统的稳定性和安全性。
3. SpringMVC @Validator 使用方法
SpringMVC 中的 @Validator 注解用于对数据进行验证,确保数据的合法性和有效性。以下是 @Validator 的使用案例:
- 创建验证器类:
@Component
public class MyValidator implements Validator {@Overridepublic boolean supports(Class<?> clazz) {return MyObject.class.equals(clazz);}@Overridepublic void validate(Object target, Errors errors) {ValidationUtils.rejectIfEmptyOrWhitespace(errors, "name", "name.empty", "姓名不能为空");// 其他验证规则}
}
在上述示例中,我们创建了一个名为 MyValidator 的验证器类,实现了 Validator 接口,并重写了 supports() 和 validate() 方法。supports() 方法用于指定该验证器支持的验证对象类型,validate() 方法用于实现具体的验证逻辑。
- 在控制器中使用 @Validator 注解:
@Controller
public class MyController {@Autowiredprivate MyValidator validator;@InitBinderprotected void initBinder(WebDataBinder binder) {binder.addValidators(validator);}@RequestMapping("/example")public String example(@Validated MyObject myObject, BindingResult result) {if (result.hasErrors()) {// 处理验证错误return "error";}// 处理业务逻辑return "example";}
}
在上述示例中,我们在控制器类中使用了 @Validator 注解,并在 initBinder() 方法中将自定义的验证器 MyValidator 添加到 WebDataBinder 中。然后,在处理请求的方法中使用 @Validated 注解标记需要验证的对象,并使用 BindingResult 参数接收验证结果。
通过这样的配置和使用,SpringMVC 会自动调用验证器对请求参数进行验证,验证结果会存储在 BindingResult 对象中。我们可以根据验证结果进行相应的处理,例如返回错误页面或处理业务逻辑。
4. SpringMVC 自定义数据验证案例
SpringMVC 中的数据验证可以通过自定义验证注解和验证器来实现。以下是一个自定义数据验证的案例:
- 创建自定义验证注解:
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = MyCustomValidator.class)
public @interface MyCustomValidation {String message() default "自定义验证失败";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}
在上述示例中,我们创建了一个名为 MyCustomValidation 的自定义验证注解。通过 @Constraint 注解指定了该注解的验证器类为 MyCustomValidator,并定义了一些默认的属性。
- 创建自定义验证器:
public class MyCustomValidator implements ConstraintValidator<MyCustomValidation, String> {@Overridepublic void initialize(MyCustomValidation constraintAnnotation) {// 初始化验证器}@Overridepublic boolean isValid(String value, ConstraintValidatorContext context) {// 自定义验证逻辑,返回 true 表示验证通过,返回 false 表示验证失败return value != null && value.startsWith("ABC");}
}
在上述示例中,我们创建了一个名为 MyCustomValidator 的自定义验证器类,实现了 ConstraintValidator 接口,并指定了该验证器对应的注解类型为 MyCustomValidation。在 isValid() 方法中实现了自定义的验证逻辑,判断字符串是否以 “ABC” 开头。
- 在实体类中使用自定义验证注解:
@Data
public class MyEntity {@MyCustomValidationprivate String myField;}
在上述示例中,我们在实体类 MyEntity 的字段 myField 上使用了自定义的验证注解 @MyCustomValidation。
- 在控制器中进行数据验证:
@Controller
public class MyController {@RequestMapping("/example")public String example(@Valid MyEntity myEntity, BindingResult result) {if (result.hasErrors()) {// 处理验证错误return "error";}// 处理业务逻辑return "example";}
}
在上述示例中,我们在处理请求的方法中使用了 @Valid 注解来触发数据验证,并使用 BindingResult 参数接收验证结果。如果验证结果中存在错误,我们可以根据需要进行相应的处理。
通过自定义验证注解和验证器,我们可以实现更加灵活和复杂的数据验证逻辑,以满足具体的业务需求。
精彩专栏推荐订阅:在下方专栏👇🏻
✅ 2023年华为OD机试真题(A卷&B卷)+ 面试指导
✅ 精选100套 Java 项目案例
✅ 面试需要避开的坑(活动)
✅ 你找不到的核心代码
✅ 带你手撕 Spring
✅ Java 初阶

相关文章:
【Java 中级】一文精通 Spring MVC - 数据验证(七)
👉博主介绍: 博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家,51CTO 专家博主 ⛪️ 个人社区&#x…...
css奇数偶数选择器
前端项目开发中,需要根据行数的奇数和偶数的不同,设置不同的颜色显示,以在视觉上给用户以良好的浏览体验,这里就需要使用css奇数偶数选择器。 主要用的::nth-of-type或者:nth-child。 方式一:nth-child div:nth-chi…...
【算法】双指针求解盛最多水的容器
Problem: 11. 盛最多水的容器 文章目录 题目解析算法原理讲解复杂度Code 题目解析 首先我们来解析一下本题 题目中说到,要找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 那我们现在来看最外侧的两根,一个高度为8&#…...
浅析SAS协议:设备接入与探测
文章目录 SAS设备初始化OOB信号SAS设备间OOB交互场景一:SAS设备两边同时发送SAS COMINIT信号场景二:SAS设备A先发送COMINIT信号场景三:SAS设备B错过COMINIT信号 SAS与SATA设备间OOB交互场景一:SATA设备未响应COMSAS信号场景二&…...
RISC-V IOPMP实际用例-Andes SoC‘s Rapid-k模型
安全之安全(security)博客目录导读 2023 RISC-V中国峰会 安全相关议题汇总 说明:本文参考RISC-V 2023中国峰会如下议题,版权归原作者所有。...
【高阶数据结构】哈希表详解
文章目录 前言1. 哈希的概念2. 哈希冲突3. 哈希函数3.1 直接定址法3.2 除留余数法--(常用)3.3 平方取中法--(了解)3.4 折叠法--(了解)3.5 随机数法--(了解)3.6 数学分析法--(了解) 4. 哈希冲突的解决方法及不同方法对应的哈希表实现4.1 闭散列(开放定址法࿰…...
C#与西门子PLC1500的ModbusTcp服务器通信4--搭建ModbusTcp客户端
1、客户端选择 客户端可以是一个程序或一个设备,这里我以C#WINFORM程序来实现客户机与PLC的Modbustcp服务器通信,开发环境是VS2019,.NET Framework版本是4.7.2 2、创建winform程序 3、引入Nmodbus4协议 找到项目,找到引用&…...
性能调优篇 二、Jvm监控及诊断工具-命令行篇
目录 一、概述1、简单命令行工具 二、jps:查看正在运行的Java程序(掌握)1、是什么?2、测试3、基本语法 三、jstat:查看jvm统计信息(掌握)1、是什么?2、基本语法3、补充 四、jinfo&am…...
Fooocus启动时modules报错的解决方法
原理:是由于其他程序的安装导致modules的版本不对,先卸载现有版本,再运行run.bat让其自动安装响应的modules版本。 1、cmd运行windows dos终端。 2、将Fooocus_win64_1-1-1035文件夹备份,rename为Fooocus_win64_1-1-1035backup文…...
RSA私钥解密操作
RSA私钥解密操作 一、背景二、操作三、常见问题3.1 invalid key format3.2 解密的数据太长3.3 Decryption error 一、背景 项目数据库中存放的敏感字段已使用rsa加密的方式,将内容加密成密文存放, 现在需要在使用的时候,使用私钥进行解密。 二、操作 …...
数据库基本知识
基本概念 数据 描述事物的符号记录称为数据,数字,文字,图形,图像,声音,档案记录等都是数据 数据是以“记录”的形式按照统一的格式进行存储的,而不是杂乱无章的 相同格式和类型的数据统一存…...
使用Redis统计网站的UV/DAU
HyperLogLog/BitMap 统计UV、DAU需要用到Redis的高级数据类型 M public class RedisKeyUtil {private static final String PREFIX_UV "uv";private static final String PREFIX_DAU "dau";// a single days UVpublic static String getUVKey(String …...
【python】报错:ImportError: DLL load failed: 找不到指定的模块 的详细解决办法
原因:安装的包与python版本不一致 解决方法: 查看python版本: #python / #python -V Python 3.7.9 (tags/v3.7.9:13c94747c7, Aug 17 2020, 18:58:18) [MSC v.1900 64 bit (AMD64)] on win32只查看python第三方模块(库、包&…...
SemrushBot蜘蛛爬虫屏蔽方式
查看访问日志时候发现有SemrushBot爬虫 屏蔽方法: 使用robots.txt文件是一种标准的协议,用于告诉搜索引擎哪些页面可以和不能被爬取,如想禁止Googlebot爬取整个网站的话,可以在该文件中添加以下内容: User-agent: Googlebot Disallow: / 对于遵循robots协议的蜘蛛…...
6 ssh面密登录
1. 首先进入自己的家目录,执行命令 [atguiguhadoop102 .ssh]$ ssh-keygen -t rsa然后敲(三个回车),就会生成两个文件id_rsa(私钥)、id_rsa.pub(公钥) 2. 将公钥拷贝到要免密登录的…...
基于微信小程序的汽车租赁系统的设计与实现ljx7y
汽车租赁系统,主要包括管理员、用户二个权限角色,对于用户角色不同,所使用的功能模块相应不同。本文从管理员、用户的功能要求出发,汽车租赁系统系统中的功能模块主要是实现管理员后端;首页、个人中心、汽车品牌管理、…...
优化学习体验的在线考试系统
随着互联网的发展,在线教育逐渐成为学习的主要方式之一。在线考试系统作为在线教育的重要组成部分,对于学习者提供了更为便捷和灵活的学习方式。但是,如何优化学习体验,提高学习效果,仍然是在线考试系统需要解决的问题…...
1267. 统计参与通信的服务器
题目描述: 这里有一幅服务器分布图,服务器的位置标识在 m * n 的整数矩阵网格 grid 中,1 表示单元格上有服务器,0 表示没有。 如果两台服务器位于同一行或者同一列,我们就认为它们之间可以进行通信。 请你统计并返回能…...
【考研数学】矩阵、向量与线性方程组解的关系梳理与讨论
文章目录 引言一、回顾二、梳理齐次线性方程组非齐次线性方程组 写在最后 引言 两个原因让我想写这篇文章,一是做矩阵题目的时候就发现这三货经常绑在一起,让人想去探寻其中奥秘;另一就是今天学了向量组的秩,让我想起来了之前遗留…...
打造个人的NAS云存储-通过Nextcloud搭建私有云盘实现公网远程访问
文章目录 摘要1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文件共享服…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡
何谓AI编程【02】AI编程官网以优雅草星云智控为例建设实践-完善顶部-建立各项子页-调整排版-优雅草卓伊凡 背景 我们以建设星云智控官网来做AI编程实践,很多人以为AI已经强大到不需要程序员了,其实不是,AI更加需要程序员,普通人…...
路由基础-路由表
本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...
