SpringBoot整合Validation数据校验

前言

        Spring Boot 集成 Validation(数据校验)是一个常见的需求,尤其在处理前端提交的数据时。Spring 提供了对 JSR-303(即 Java Bean Validation)标准的支持,可以使用注解来声明数据校验规则。

1. 引入依赖

首先,确保你的 Spring Boot 项目已经包含了相关的依赖,特别是 spring-boot-starter-validation,它会自动引入 Hibernate Validator(JSR-303 实现)。

pom.xml 中加入以下依赖:

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

2. 创建实体类并使用校验注解

假设我们有一个用户注册的场景,我们需要对用户提交的注册信息进行校验,比如用户的姓名、邮箱、年龄等字段。

用户注册实体类:

import javax.validation.constraints.*;public class User {@NotBlank(message = "用户名不能为空")@Size(min = 3, max = 50, message = "用户名长度必须在3到50之间")private String username;@Email(message = "邮箱格式不正确")@NotBlank(message = "邮箱不能为空")private String email;@Min(value = 18, message = "年龄必须大于等于18岁")@Max(value = 100, message = "年龄必须小于等于100岁")private Integer age;@NotBlank(message = "密码不能为空")@Size(min = 6, max = 20, message = "密码长度必须在6到20之间")private String password;// Getters and Setters
}

3. 在 Controller 中使用 @Valid 注解触发校验

在 Spring Boot 的 Controller 层,可以使用 @Valid 注解来触发数据校验。接收请求体中的数据时,Spring 会自动根据 User 类中的校验注解进行校验。

注册接口:

import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;import javax.validation.Valid;@RestController
@RequestMapping("/user")
public class UserController {@PostMapping("/register")public ResponseEntity<String> register(@Valid @RequestBody User user) {// 如果数据校验成功,进入此方法return ResponseEntity.ok("用户注册成功");}
}
  • @RequestBody:表明请求体的内容会被映射到 User 对象。

  • @Valid:触发对 User 对象的校验。

4. 异常处理:捕获校验失败的异常

如果请求数据不符合校验规则,Spring Boot 会抛出 MethodArgumentNotValidException。我们可以通过自定义异常处理来返回更友好的错误信息。

全局异常处理:

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.HashMap;
import java.util.Map;@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<Map<String, String>> handleValidationException(MethodArgumentNotValidException ex) {Map<String, String> errors = new HashMap<>();ex.getBindingResult().getAllErrors().forEach(error -> {String fieldName = ((org.springframework.validation.FieldError) error).getField();String message = error.getDefaultMessage();errors.put(fieldName, message);});return new ResponseEntity<>(errors, HttpStatus.BAD_REQUEST);}
}

在这个 GlobalExceptionHandler 类中,我们捕获了 MethodArgumentNotValidException 异常,并从异常中提取字段名和错误消息,最终将错误信息返回给客户端。

5. 测试

假设我们有以下数据作为请求体来测试注册接口:

有效请求体(JSON)

{"username": "john_doe","email": "john@example.com","age": 25,"password": "password123"
}

返回:

{"message": "用户注册成功"
}

无效请求体(JSON)

{"username": "","email": "invalid-email","age": 17,"password": "123"
}

返回:

{"username": "用户名不能为空","email": "邮箱格式不正确","age": "年龄必须大于等于18岁","password": "密码长度必须在6到20之间"
}

6. 常见的校验注解

  • @NotNull:字段不能为 null。

  • @NotBlank:字符串不能为空,不仅检查 null 还会检查是否是空字符串。

  • @Size(min = , max = ):字符串长度的范围。

  • @Min 和 @Max:数字的最小和最大值。

  • @Email:验证是否是有效的电子邮件格式。

  • @Pattern:正则表达式验证。

  • @Positive:数字必须为正。

  • @Negative:数字必须为负。

7. 自定义校验注解

如果需要自定义复杂的校验逻辑,可以创建自己的校验注解和校验器。以下是一个简单的自定义校验注解示例。

创建自定义注解:

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Constraint(validatedBy = PasswordValidator.class)
@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ValidPassword {String message() default "密码必须包含至少一个字母和一个数字";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};
}

创建校验器:

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;public class PasswordValidator implements ConstraintValidator<ValidPassword, String> {@Overridepublic void initialize(ValidPassword constraintAnnotation) {}@Overridepublic boolean isValid(String password, ConstraintValidatorContext context) {if (password == null) {return false;}return password.matches(".*[a-zA-Z].*") && password.matches(".*[0-9].*");}
}

使用自定义注解:

public class User {@ValidPasswordprivate String password;// Getters and Setters
}

总结

  1. Spring Boot 默认集成了 Hibernate Validator,支持使用 JSR-303 注解进行数据校验。

  2. 使用 @Valid 注解来触发校验,@RequestBody 注解用于接收请求体。

  3. @NotNull@Size@Min@Max 等是常用的校验注解,支持基本的字段校验。

  4. 自定义校验注解可以通过实现 ConstraintValidator 接口来完成。

  5. 异常处理可以通过 @RestControllerAdvice 捕获和处理校验异常,返回友好的错误信息。

这样,你就可以在 Spring Boot 中使用验证框架来轻松实现数据的校验,增强应用的健壮性

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

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

相关文章

智能探针技术:实现可视、可知、可诊的主动网络运维策略

网络维护的重要性 网络运维是确保网络系统稳定、高效、安全运行的关键活动。在当今这个高度依赖信息技术的时代&#xff0c;网络运维的重要性不仅体现在技术层面&#xff0c;更关乎到企业运营的方方面面。网络运维具有保障网络的稳定性、提升网络运维性能、降低企业运营成本等…

RT-DETR融合Inner-IoU及相关改进思路

RT-DETR使用教程&#xff1a; RT-DETR使用教程 RT-DETR改进汇总贴&#xff1a;RT-DETR更新汇总贴 《Inner-IoU: More Effective Intersection over Union Loss with Auxiliary Bounding Box》 一、 模块介绍 论文链接&#xff1a;https://arxiv.org/abs/2311.02877 代码链接&a…

在Springboot项目中实现将文件上传至阿里云 OSS

oss介绍 阿里云对象存储服务&#xff08;OSS&#xff09;是一种高效、安全和成本低廉的数据存储服务&#xff0c;可以用来存储和管理海量的数据文件。本文将教你如何使用 Java 将文件上传到阿里云 OSS&#xff0c;并实现访问文件。 1. 准备工作 1.1 开通 OSS 服务 登录阿里云…

Java项目中加缓存

Java项目中加缓存 1.更新频率低&#xff1b;但读写频率高的数据很适合加缓存&#xff1b; 2.可以加缓存的地方很多&#xff1a;浏览器的缓存&#xff1b;CDN的缓存&#xff1b;服务器的缓存&#xff1b; 本地内存&#xff1b;分布式远端缓存&#xff1b; 加缓存的时候不要…

Vuex —— Day1

vuex概述 vuex是vue的状态管理工具&#xff0c;可以帮我们管理vue通用的数据&#xff08;多组件共享的数据&#xff09; vuex的应用场景&#xff1a; 某个状态在很多个组件中都会使用&#xff08;eg.个人信息&#xff09;多个组件共同维护一份数据&#xff08;eg.购物车&…

【前端】Next.js 服务器端渲染(SSR)与客户端渲染(CSR)的最佳实践

关于Next.js 服务器端渲染&#xff08;SSR&#xff09;与客户端渲染&#xff08;CSR&#xff09;的实践内容方面&#xff0c;我们按下面几点进行阐述。 1. 原理 服务器端渲染 (SSR): 在服务器上生成完整的HTML页面&#xff0c;然后发送给客户端。这使得用户在首次访问时能够…

基于FPGA的FM调制(载波频率、频偏、峰值、DAC输出)-带仿真文件-上板验证正确

基于FPGA的FM调制-带仿真文件-上板验证正确 前言一、FM调制储备知识载波频率频偏峰值个人理解 二、代码分析1.模块分析2.波形分析 总结 前言 FM、AM等调制是学习FPGA信号处理一个比较好的小项目&#xff0c;通过学习FM调制过程熟悉信号处理的一个简单流程&#xff0c;进而熟悉…

Scala学习记录,统计成绩

统计成绩练习 1.计算每个同学的总分和平均分 2.统计每个科目的平均分 3.列出总分前三名和单科前三名&#xff0c;并保存结果到文件中 解题思路如下&#xff1a; 1.读入txt文件&#xff0c;按行读入 2.处理数据 &#xff08;1&#xff09;计算每个同学的总分平均分 import s…

路由策略与路由控制实验

AR1、AR2、AR3在互联接口、Loopback0接口上激活OSPF。AR3、AR4属于IS-IS Area 49.0001&#xff0c;这两者都是Level-1路由器&#xff0c;AR3、AR4的系统ID采用0000.0000.000x格式&#xff0c;其中x为设备编号 AR1上存在三个业务网段A、B、C&#xff08;分别用Loopback1、2、3接…

第J7周:对于RenseNeXt-50算法的思考

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 文章目录 一、前言1、导入包2、分组卷积模块3、残差单元4、堆叠残差单元5、搭建ResNeXt-50网络 二、问题思考 电脑环境&#xff1a; 语言环境&#xff1a;Pyth…

某充电桩业务服务内存监控和程序行为分析

原作者&#xff1a;展贝 原文地址&#xff1a;https://mp.weixin.qq.com/s/nnYCcVtwowvmj7Zn9XLIUg 在当今数据驱动的环境中&#xff0c;理解内存指标和程序行为对于确保应用程序的性能和可靠性至关重要。在依赖实时数据处理和高可用性的行业中尤其如此。通过利用可观测工具&am…

基于SpringBoot共享汽车管理系统【附源码】

基于SpringBoot共享汽车管理系统 效果如下&#xff1a; 系统注册页面 系统登陆页面 系统管理员主页面 用户信息管理页面 汽车投放管理页面 使用订单页面 汽车归还管理页面 研究背景 随着计算机技术和计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所。二十…

计算机网络基础(2):网络安全/ 网络通信介质

1. 网络安全威胁 网络安全&#xff1a;目的就是要让网络入侵者进不了网络系统&#xff0c;及时强行攻入网络&#xff0c;也拿不走信息&#xff0c;改不了数据&#xff0c;看不懂信息。 事发后能审查追踪到破坏者&#xff0c;让破坏者跑不掉。 网络威胁来自多方面&#xff1a…

Cesium K-means自动聚合点的原理

Cesium K-means自动聚合点的原理 Cesium 是一个开源的 JavaScript 库&#xff0c;用于在 Web 环境中创建 3D 地球和地图应用。它能够处理地理空间数据&#xff0c;并允许开发者对大规模的地理数据进行可视化展示。在一些应用中&#xff0c;尤其是当处理大量地理坐标点时&#…

JAVA:Spring Boot 3 实现 Gzip 压缩优化的技术指南

1、简述 随着 Web 应用的用户量和数据量增加&#xff0c;网络带宽和页面加载速度逐渐成为瓶颈。为了减少数据传输量&#xff0c;提高用户体验&#xff0c;我们可以使用 Gzip 压缩 HTTP 响应。本文将介绍如何在 Spring Boot 3 中实现 Gzip 压缩优化。 2、配置 Spring Boot 3 对…

TsingtaoAI具身智能高校实训方案通过华为昇腾技术认证

日前&#xff0c;TsingtaoAI推出的“具身智能高校实训解决方案-从AI大模型机器人到通用具身智能”基于华为技术有限公司AI框架昇思MindSpore&#xff0c;完成并通过昇腾相互兼容性技术认证。 TsingtaoAI&华为昇腾联合解决方案 本项目“具身智能高校实训解决方案”以实现高…

vitess使用记录:vtctldclient,设置分表规则

继续探索未完成的事情。 vitess使用记录系列已经写了好几篇了&#xff0c;记录了在测试过程中遇到的各种问题。《vitess使用&#xff1a;从部署到go客户端连接查询》、《vitess使用记录&#xff1a;vtctldclient》、《vitess使用&#xff1a;基于源码运行vtctldclient工具》整…

houdini肌肉刷pin点的方法

目标&#xff1a;产生gluetoanimation这个属性 主要节点&#xff1a;attribute paint(或者muscle paint) 步骤1&#xff1a; 导入肌肉资产 导入的是rest shape的肌肉 在有侧边栏可以打开display group and attribute list&#xff0c;方便查看group。不同的肌肉块按照muscl…

10个Word自动化办公脚本

在日常工作和学习中&#xff0c;我们常常需要处理Word文档&#xff08;.docx&#xff09;。 Python提供了强大的库&#xff0c;如python-docx&#xff0c;使我们能够轻松地进行文档创建、编辑和格式化等操作。本文将分享10个使用Python编写的Word自动化脚本&#xff0c;帮助新…

在开发环境中,前端(手机端),后端(电脑端),那么应该如何设置iisExpress

首先&#xff0c;要想手机端应用能成功请求后端&#xff0c;两个设备至少需在同一个局域网内&#xff0c;且IP地址互通&#xff1b; 因为ajax是http(s)://IP地址端口号的方式请求&#xff0c;但是iisExpress默认是localhost如何解决&#xff0c;并没有IP地址&#xff0c;所以手…