JSR-303是Java 的标准规范,而 Spring MVC 对其提供了完美的支持和集成

1.JSR-303 的身份

JSR-303 是 Java 标准
JSR:Java Specification Request(Java 规范请求)
JSR-303:Bean Validation 1.0(Bean 验证规范)
后续版本:JSR-349(Bean Validation 1.1)、JSR-380(Bean Validation 2.0)

2.添加依赖

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

3.实体类添加验证注解

public class User {@NotNull(message = "用户ID不能为空")private Long id;@NotBlank(message = "用户名不能为空")@Size(min = 2, max = 20, message = "用户名长度必须在2-20字符之间")private String username;@Email(message = "邮箱格式不正确")private String email;@Min(value = 18, message = "年龄必须大于18岁")@Max(value = 100, message = "年龄必须小于100岁")private Integer age;@Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")private String phone;@Future(message = "生效时间必须是将来的时间")private LocalDateTime effectiveDate;// Getter和Setter
}

4. Controller 中使用验证

@RestController
@RequestMapping("/api/users")
public class UserController {// 1. 简单的参数验证@PostMappingpublic ResponseEntity<?> createUser(@RequestBody @Valid User user) {return ResponseEntity.ok(userService.createUser(user));}// 2. 获取验证错误信息@PostMapping("/with-binding")public ResponseEntity<?> createUserWithBinding(@RequestBody @Valid User user, BindingResult bindingResult) {if (bindingResult.hasErrors()) {// 手动处理验证错误List<String> errors = bindingResult.getFieldErrors().stream().map(error -> error.getField() + ": " + error.getDefaultMessage()).collect(Collectors.toList());return ResponseEntity.badRequest().body(errors);}return ResponseEntity.ok(userService.createUser(user));}
}

5.全局异常处理(推荐使用)

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<ErrorResponse> handleValidationException(MethodArgumentNotValidException ex) {List<FieldError> fieldErrors = ex.getBindingResult().getFieldErrors();List<String> errors = fieldErrors.stream().map(error -> error.getField() + ": " + error.getDefaultMessage()).collect(Collectors.toList());//这里封装太简单,也不具有扩展性ErrorResponse errorResponse = new ErrorResponse("VALIDATION_FAILED","参数验证失败",errors);return ResponseEntity.badRequest().body(errorResponse);}
}

对于异常,应该给上层和前端传递状态和消息,而不仅仅是抛出异常。而一个系统往往有很多异常,
此外如果只传递数字和信息,则未来如果变化,则数字信息都需要修改,这个改动范围很大,所以可以用枚举来定义各种异常的状态和信息,并生成文档

故应该使用
1.异常类:BizException
2.异常枚举类:BizExceptionEnume:列举出每个模块都会出现的异常情况

6.常见注解

注解说明示例
@NotNull值不能为null@NotNull(message = “不能为空”)
@NotBlank字符串不能为空@NotBlank(message = “姓名不能为空”)
@Size长度限制@Size(min=2, max=100)
@Pattern正则表达式@Pattern(regexp = “^1[3-9]\d{9}$”)
@Min / @Max数值范围@Min(18) @Max(100)
@DecimalMin / @DecimalMax小数范围@DecimalMin(“0.0”)
@Positive / @Negative正数/负数@Positive
@Future / @Past时间限制@Future

7.基本流程

1.方式一

1.导入注解
2.编写校验注解
3.使用@Valid告诉SpringMVC进行校验
4.BindingResult

2.方式二【推荐】

1.导入注解
2.编写校验注解
3.使用@Valid告诉SpringMVC进行校验
【推荐】4.编写一个全局异常处理器,处理MethodArgumentNotValidException并统一返回校验失败的提示信息

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

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

相关文章

SlowFast使用指南(三)——自建数据集

写在前面 在前两个章节初步使用了SlowFast&#xff0c;使用的都是官方给出的数据集。 附上链接&#xff1a; SlowFast使用指南&#xff08;一&#xff09;——demo运行-CSDN博客 SlowFast使用指南&#xff08;二&#xff09;——训练ava数据集-CSDN博客 本文尝试了使用自己的数…

Day26 树的层序遍历 哈希表 排序算法 内核链表

day26 树的层序遍历 哈希表 排序算法 内核链表 实现树的层序遍历&#xff08;广度遍历&#xff09; 使用队列辅助实现二叉树的层序遍历。算法核心思想是&#xff1a;从根节点开始&#xff0c;依次将每一层的节点入队&#xff0c;出队时访问该节点&#xff0c;并将其左右子节点&…

【系统分析师】高分论文:论快速应用开发方法及应用

【摘要】 我在某县卫生健康委员会公共卫生信息中心工作&#xff0c;是信息中心的负责人。2021年5月&#xff0c;我中心受县痪病预防控制中心委托&#xff0c;为某种痪病疫苗3期临床项日开发受试对象拦截系统。我负责系统架构设计、需求分析以及后期的部分编码工作。通过与庆病预…

4056:【GESP2403八级】接竹竿

/*4056&#xff1a;【GESP2403八级】接竹竿flag 数组 存储每个元素出现的位置&#xff0c;nxt[i]j;存储每个位置 后面第一次出现 与a【i】相等的位置//其中 a【i]a[j] :记录i的下一个位置 &#xff0c;flag 存储每个值的位置下一次 具有下一次&#xff0c;相当于的链表了&…

企业落地版 AutoGen 多智能体工程(完整示例)

企业生产级参考实现,目标是一套可直接部署的模板工程,包含: FastAPI HTTP API(任务提交、状态查询) Celery 异步任务队列(Redis Broker) PostgreSQL + pgvector(向量存储,RAG) SQLAlchemy + Alembic(ORM 与迁移) AutoGen 多智能体编排(Planner / Coder / Executor…

前端的请求协议对应java的接收

application/json前端发送 JSON 数据&#xff0c;后端用 RequestBody 接收并自动映射为 Java 对象。前端示例&#xff08;Axios&#xff09;&#xff1a;axios.post("/api/user", { name: "张三", age: 20 }, {headers: { "Content-Type": "…

esp32_hid_device 调试遇到的一些问题

nimble to windows10 22h2esp_hid_device 的keyboardReportMap在win10 22h2 csr4.0 下好像识别不了&#xff0c; Windows&#xff08;和大多数 BIOS/UEFI&#xff09;只认 6-byte key array 的 HID Keyboard 描述符。如果不是 6 个字节&#xff0c;Windows HID 驱动就会认为这不…

观察者模式 (Observer Pattern)与几个C++应用例子

1. 模式定义与核心思想 观察者模式定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。当这个主题对象的状态发生变化时&#xff0c;它会自动通知所有观察者对象&#xff0c;使它们能够自动更新自己。核心思想&#xff1a; 解耦主题和观察者。主题…

[系统架构设计师]论文(二十三)

[系统架构设计师]论文&#xff08;二十三&#xff09; 一.论软件系统架构评估 1.架构所关注的质量属性主要有&#xff1a;性能&#xff0c;可用性&#xff0c;安全性&#xff0c;可修改性 1&#xff09;性能。性能是指系统的响应能力&#xff0c;即要经过多长时间才能对某个事件…

攻克 Java 分布式难题:并发模型优化与分布式事务处理实战指南

攻克 Java 分布式难题&#xff1a;并发模型优化与分布式事务处理实战指南 开场&#xff1a;从“摇摇欲坠”到“稳如磐石”&#xff0c;你的分布式系统进阶之路 你是否曾经遇到过这样的场景&#xff1f;精心打造的电商应用&#xff0c;在大促开启的瞬间&#xff0c;页面响应变得…

如何在Ubuntu中删除或修改已有的IP地址设置?

在 Ubuntu 中为新增加的网卡设置网络时&#xff0c;需要区分原有网卡和新网卡的配置&#xff0c;确保它们可以独立工作&#xff08;可在同一网段或不同网段&#xff09;。以下是具体步骤&#xff0c;假设你需要为新网卡配置静态 IP&#xff08;以 192.168.1.190/24 为例&#x…

Ansible Playbook 概述与实践案例(下)

#作者&#xff1a;张桐瑞 文章目录四、条件判断的实现五、循环的实现六、Jinja模板应用1、Jinja模板2、handlers组件七、角色 role1、角色介绍2、案例: 部署zabbix-agent四、条件判断的实现 when: 条件 - hosts: appserveruser: roottasks:- name: create userAuser: nameuser…

LeetCode 100 -- Day6

1. 哈希&#xff1a;49、128&#xff08;1&#xff09;49 字母异位词分组 -- 字典from collections import defaultdict class Solution(object):def groupAnagrams(self, strs):"""创建字典{sorted_string&#xff1a;原str}"""resultsdefaultd…

多因素认证(MFA/2FA)实战指南:如何保护你的账号

一、MFA/2FA 基础认知 1. 概念辨析与演进 单因素认证&#xff08;1FA&#xff09;的局限性&#xff1a;仅依赖 “知识因素”&#xff08;如密码&#xff09;&#xff0c;据 2024 年 Verizon 数据泄露报告&#xff0c;81% 的账户入侵源于密码泄露 —— 要么是用户使用弱密码&a…

vue3 字符 居中显示

在Vue 3中&#xff0c;要实现字符的居中显示&#xff0c;你可以使用多种方法&#xff0c;具体取决于你是想在HTML元素内居中文本&#xff0c;还是在CSS样式中实现。下面是一些常见的方法&#xff1a;1. 使用内联样式你可以直接在元素上使用style属性来实现文本的居中。<temp…

《Spring Boot 进阶:从零到一打造自定义 @Transactional》 ——支持多数据源、动态传播行为、可插拔回滚策略

《Spring Boot 进阶&#xff1a;从零到一打造自定义 Transactional》 ——支持多数据源、动态传播行为、可插拔回滚策略版本&#xff1a;Spring Boot 3.2.x JDK 17一、背景与痛点痛点默认 Transactional 限制多数据源只能绑定一个 DataSourceTransactionManager多租户无法在运…

open3D学习笔记

这里写自定义目录标题 核心3D数据结构 1.1 PointCloud(点云) 最近邻搜索 (KNN/Radius) 与空间索引(KDTree/Octree) 法线估计 (Normal Estimation) 聚类分割 (基于欧氏距离的聚类) 1.2 TriangleMesh (三角形网格) 泊松表面重建 (Poisson Surface Reconstruction) 滚球法 (Ba…

gt_k_char设计模块

是不是再fiber或者gt设计中经常遇到接收数据没有对齐&#xff1f;是的。很多协议需要手动对齐设计。这不&#xff0c;它来了。下面是手动对齐代码设计&#xff0c;本人在很多工程和项目中应用过&#xff0c;现在共享出来&#xff0c;给大家使用。module gt_k_char (input …

网页版云手机怎么样

随着科技的不断发展&#xff0c;云手机这一新兴概念逐渐走入大众视野&#xff0c;而网页版云手机作为云手机的一种便捷使用方式&#xff0c;备受关注&#xff0c;下面从多个方面来探讨网页版云手机究竟怎么样。与传统的需要在本地设备安装专门APP的云手机使用方式不同&#xff…

XFile v2 系统架构文档

XFile v2 系统架构文档 1. 概述 XFile 是一个基于 Go 语言开发的分布式文件管理系统&#xff0c;提供本地文件存储、网络文件共享、安全认证和多种文件操作功能。该系统采用模块化设计&#xff0c;支持大文件分片存储、用户权限管理、双因素认证等高级功能。 XFile系统的核心特…