使用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> {

    @Override
    public void initialize(ValidAge constraintAnnotation) {
    }

    @Override
    public boolean isValid(Integer age, ConstraintValidatorContext context) {
        return age != null && age >= 18 && age <= 60;
    }
}

5.3 使用自定义注解

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

public class User {

    @ValidAge
    private Integer age;

    // 其他字段和方法
}

6. 总结

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

解决阿里云三个月证书过期 免费SSL证书部署教程

相信有上线过自己的网站、小程序经验的同学深有体会&#xff0c;给服务加上 SSL 证书还挺麻烦的&#xff0c;尤其是没有运维经验的同学。本来最省事的方法是买个证书&#xff0c;但是一看价格&#xff0c;还是算了吧&#xff0c;动辄就是几万块一年。作为个人来说&#xff0c;这…

简单走近ChatGPT

目录 一、ChatGPT整体背景认知 &#xff08;一&#xff09;ChatGPT引起关注的原因 &#xff08;二&#xff09;与其他公司的竞争情况 二、NLP学习范式的发展 &#xff08;一&#xff09;规则和机器学习时期 &#xff08;二&#xff09;基于神经网络的监督学习时期 &…

恢复Ubuntu+Windows10双系统安装前状态及分区还原详细步骤

1、恢复到安装 Ubuntu 之前的状态&#xff0c;先看看系统属性 2、选择 运行 3、 输入 msinfo32 回车 4、注意查看 BIOS 模式这一栏&#xff0c;UEFI&#xff0c;这里我们以UEFI系统为例 5、下来就可以开始进行 Ubuntu 的移除操作了 6、从Windows打开网页搜索磁盘精灵&#xff0…

一文搞定 InternStudio 开发机的使用 | 书生大模型

文章目录 创建开发机使用 SSH 远程连接开发机使用密码进行 SSH 远程连接使用 VScode 进行 SSH 远程连接 端口映射核心目标开发机端口映射的工作方式使用 VScode 进行端口映射运行 hello_world.py 代码进行测试测试成功页面 参考文献 创建开发机 InternStudio控制台 这里先做测…

WindowsDocker安装到D盘,C盘太占用空间了。

Windows安装 Docker Desktop的时候,默认位置是安装在C盘,使用Docker下载的镜像文件也是保存在C盘,如果对Docker使用评率比较高的小伙伴,可能C盘空间,会被耗尽,有没有一种办法可以将Docker安装到其它磁盘,同时Docker的数据文件也保存在其他磁盘呢? 答案是有的,我们可以…

关于我、重生到500年前凭借C语言改变世界科技vlog.15——深入理解指针(4)

文章目录 1.回调函数的介绍2. qsort使用实例2.1 qsort函数介绍2.2使用 qsort 函数排序整型数据2.3使用 qsort 排序结构数据 3. qsort的模拟实现希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 1.回调函数的介绍 回调函数就是一个通过函数指针调用…

内网项目,maven本地仓库离线打包,解决Cannot access central in offline mode?

背景&#xff1a; 内网项目打包&#xff0c;解决Cannot access central in offline mode? 1、修改maven配置文件&#xff1a; localRepository改为本地仓库位置 <localRepository>D:\WorkSpace\WorkSoft\maven-repository\iwhalecloud-repository\business</loca…

笔记整理—linux驱动开发部分(8)framebuffer类设备

framebuffer显示设备。 在应用层直接抽象位向DDR中存放图片。 在操作系统中&#xff0c;将上图分为两个部分&#xff1a;驱动应用。 使用复制的方法效率十分的低&#xff0c;所以有了内存映射方法实现图片的显示。 framebuffer帧&#xff08;铺满一个屏幕&#xff09;&#xff…

第三十章 章节练习商品列表组件封装

目录 一、需求说明 二、技术要点 三、完整代码 3.1. main.js 3.2. App.vue 3.3. MyTable.vue 3.4. MyTag.vue 一、需求说明 1. my-tag 标签组件封装 (1) 双击显示输入框&#xff0c;输入框获取焦点 (2) 失去焦点&#xff0c;隐藏输入框 (3) 回显标签信息 (4) 内…

EHOME视频平台EasyCVR萤石设备视频接入平台视频诊断技术可以识别哪些视频质量问题?

EasyCVR视频监控汇聚管理平台是一款针对大中型项目设计的跨区域网络化视频监控集中管理平台。萤石设备视频接入平台EasyCVR不仅具备视频资源管理、设备管理、用户管理、运维管理和安全管理等功能&#xff0c;还支持多种主流标准协议&#xff0c;如GB28181、GB35114、RTSP/Onvif…

如何在 PyQt 中启动“绘图循环”?

在 PyQt 中实现一个“绘图循环”可以使用 定时器&#xff08;QTimer&#xff09;&#xff0c;让应用程序在指定的时间间隔内反复触发一个绘图函数。这种方法对于需要持续更新绘图&#xff08;例如动画效果&#xff09;的情况特别有用。 1、问题背景 在GUI编程中&#xff0c;我…

Linux 线程控制

一. 线程互斥 1.1 线程互斥相关概念 临界资源&#xff1a;多线程执行流共享的资源就叫做临界资源。临界区&#xff1a;每个线程内部&#xff0c;访问临界资源的代码&#xff0c;就叫做临界区。互斥&#xff1a;任何时刻&#xff0c;互斥保证有且只有一个执行流进入临界区&…

分布式光伏发电的投融资计算

分布式光伏发电项目的成功实施离不开科学、合理的投融资计算&#xff0c;为光伏项目的前期开发提供切实可行的依据。 一、分布式光伏发电项目的投资成本 分布式光伏发电项目的投资成本包括多个方面&#xff0c;主要包括光伏组件采购成本、逆变器和支架系统成本、安装和施工成本…

MyBatis 返回 Map 或 List<Map>时,时间类型数据,默认为LocalDateTime,响应给前端默认含有‘T‘字符

一、问题 MyBatis 返回 Map 或 List时&#xff0c;时间类型数据&#xff0c;默认为LocalDateTime Springboot 响应给前端的LocalDateTime&#xff0c;默认含有’T’字符&#xff0c;如何统一配置去掉 二、解决方案 1、pom.xml 增加依赖&#xff08;2024.11.6 补充&#xff…

AMD显卡低负载看视频掉驱动(chrome edge浏览器) 高负载玩游戏却稳定 解决方法——关闭MPO

问题 折磨的开始是天下苦黄狗久矣&#xff0c;为了不再被讨乞丐的显存恶心&#xff0c;一怒之下购入了AMD显卡&#xff08;20GB显存确实爽 头一天就跑了3dmark验机&#xff0c;完美通过&#xff0c;玩游戏也没毛病 但是呢这厮是一点不省心&#xff0c;玩游戏没问题&#xff0c…

记录新建wordpress站的实践踩坑:wordpress 上传源码新建站因权限问题导致无法访问、配置新站建站向导以及插件主题上传配置的解决办法

官方文档&#xff1a;How to install WordPress – Advanced Administration Handbook | Developer.WordPress.org 但是没写权限问题&#xff0c;可以下载到 wordpress官方包。 把下载的wordpresscn的包解压并上传到服务器目录下&#xff0c;但是因为是root上传导致了权限问题…

【大数据学习 | kafka】kafka的偏移量管理

1. 偏移量的概念 消费者在消费数据的时候需要将消费的记录存储到一个位置&#xff0c;防止因为消费者程序宕机而引起断点消费数据丢失问题&#xff0c;下一次可以按照相应的位置从kafka中找寻数据&#xff0c;这个消费位置记录称之为偏移量offset。 kafka0.9以前版本将偏移量信…

迪杰斯特拉算法

迪杰斯特拉算法 LeetCode 743. 网络延迟时间 https://blog.csdn.net/xiaoxi_hahaha/article/details/110257368 import sysdef dijkstra(graph, source):"""dijkstra算法:param graph: 邻接矩阵:param source: 出发点&#xff0c;源点:return:""&…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第十八集补充:制作空洞骑士独有的EventSystem和InputModule

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作空洞骑士独有的EventSystem和InputModule总结 前言 hello大家好久没见&#xff0c;之所以隔了这么久才更新并不是因为我又放弃了这个项目&#xff0c;而…

K8S群集调度二

一、污点(Taint) 和 容忍(Tolerations) 1.1、污点(Taint) 设置在node上是对pod的一种作用 节点的亲和性&#xff0c;是Pod的一种属性&#xff08;偏好或硬性要求&#xff09;&#xff0c;它使Pod被吸引到一类特定的节点 而Taint 则相反&#xff0c;它使节点能够排斥一类特…