当前位置: 首页 > news >正文

Spring @Valid 不生效 问题记录

校验的简单使用:

在Spring中,我们可以使用@Valid注解对实体进行校验。在Controller的方法参数中添加@Valid注解,然后在实体类的属性上添加校验注解,例如@NotNull、@Size等。例如:

@RestController
public class UserController {@PostMapping("/users")public ResponseEntity<User> createUser(@Valid @RequestBody User user) {userService.createUser(user);return new ResponseEntity<>(user, HttpStatus.CREATED);}
}

在这个例子中,我们使用@Valid注解对User实体进行校验,并在User类的属性上添加了@NotNull和@Size注解。当请求到达Controller时,Spring会自动对User实体进行校验,如果校验失败则会抛出MethodArgumentNotValidException异常。我们可以使用@ControllerAdvice和@ExceptionHandler来处理校验异常,并返回自定义的错误信息。例如:

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(MethodArgumentNotValidException.class)public ResponseEntity<ErrorResponse> handleValidationException(MethodArgumentNotValidException ex) {BindingResult result = ex.getBindingResult();List<FieldError> fieldErrors = result.getFieldErrors();List<String> errors = new ArrayList<>();for (FieldError fieldError : fieldErrors) {errors.add(fieldError.getField() + ": " + fieldError.getDefaultMessage());}ErrorResponse errorResponse = new ErrorResponse(HttpStatus.BAD_REQUEST, "Validation failed", errors);return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);}
}

在这个例子中,我们使用@ControllerAdvice注解来定义全局的异常处理器,并使用@ExceptionHandler注解来处理MethodArgumentNotValidException异常。在处理过程中,我们从异常中获取校验结果并转换成自定义的错误信息,然后封装成ErrorResponse对象并返回。如果请求中包含了校验错误,Spring会自动调用该处理器并返回错误信息。

@Valid @Validated 有什么区别

@Valid和@Validated注解都可以用于实体类属性的校验。它们的主要区别在于支持的校验分组和校验器的不同。

@Valid注解只支持默认分组,即没有使用任何分组的校验注解。它使用的是javax.validation包下的校验器。

@Validated注解支持分组校验,即可以使用指定分组的校验注解进行校验。它使用的是Spring自己的校验器,支持JSR-303和JSR-349规范。

此外@Validated 注解还可以用于方法级别的校验,例如:

@Service
public class UserService {@Validatedpublic void createUser(@NotNull User user) {//...}
}

在这个例子中,我们使用@Validated注解对createUser方法进行校验,并使用@NotNull注解对User参数进行非空校验。如果校验失败,Spring会抛出ConstraintViolationException异常。

Spring 是如何实现校验的

简单理解:

在Spring中,我们可以使用@NotBlank注解对字符串进行非空校验。在实体类的属性上添加@NotBlank注解即可。例如:

public class User {@NotBlankprivate String username;//...
}

在这个例子中,我们使用@NotBlank注解对username属性进行非空校验。当请求到达Controller时,Spring会自动对User实体进行校验,如果校验失败则会抛出MethodArgumentNotValidException异常。

深入理解:

在Spring中,在方法执行前执行校验注解的过程是由MethodValidationInterceptor拦截器实现的。这个拦截器会在方法调用前执行校验注解,如果校验失败会抛出异常。在拦截器中,会先获取方法上的校验注解,然后根据注解的类型,调用不同的校验器进行校验。如果校验失败,会抛出ConstraintViolationException异常。

MethodValidationInterceptor会被Spring的其中一个BeanPostProcessor: MethodValidationPostProcessor在Bean初始化时作为默认的方法校验增强器进行创建。

整体理解:

当Spring框架在执行方法时,会先查找是否存在MethodValidationPostProcessor后置处理器。如果存在,它会在方法执行之前执行校验注解的过程。

MethodValidationPostProcessor后置处理器会在BeanPostProcessor的postProcessBeforeInitialization方法中执行,具体流程如下:

  1. Spring容器启动时,会扫描所有的BeanDefinition,包括MethodValidationPostProcessor。
  2. 当容器实例化MethodValidationPostProcessor时,会调用BeanPostProcessor的postProcessBeforeInitialization方法。
  3. 在postProcessBeforeInitialization方法中,MethodValidationPostProcessor会检查Bean是否包含@Validated注解,并生成一个代理对象。
  4. 当原始Bean方法被调用时,代理对象会执行校验注解的过程。如果校验失败,会抛出异常。
  5. 如果代理对象的校验通过,会调用原始Bean方法并返回结果。

综上所述,Spring解析@Valid的过程主要涉及到MethodValidationPostProcessor后置处理器,在BeanPostProcessor的postProcessBeforeInitialization方法中生成代理对象,并在方法执行前执行校验注解的过程。

校验所需的依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId><version>2.7.10</version><exclusions><exclusion><artifactId>spring-boot-starter-logging</artifactId><groupId>org.springframework.boot</groupId></exclusion><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></exclusion></exclusions>
</dependency>

如果是SpringBoot项目需要注意判断是否已经存在必须的依赖 spring-boot-starter-validation,注意如果Spring-boot的版本大于3.0必须最第使用JDK17。上面的依赖版本是3.0以下可用的最高版本。

相关文章:

Spring @Valid 不生效 问题记录

校验的简单使用&#xff1a; 在Spring中&#xff0c;我们可以使用Valid注解对实体进行校验。在Controller的方法参数中添加Valid注解&#xff0c;然后在实体类的属性上添加校验注解&#xff0c;例如NotNull、Size等。例如&#xff1a; RestController public class UserContr…...

五步教你如何注册一个公司网站

在今天的数字化时代&#xff0c;每个公司都需要一个强大的线上存在感。注册一个公司网站是实现这一目标的第一步。但是&#xff0c;对于许多公司而言&#xff0c;这个过程可能有些困难。因此&#xff0c;在本文中&#xff0c;我将介绍一个五步计划&#xff0c;让您轻松注册一个…...

CSS绘制气泡对话框样式(有边框)

1、效果图 2、难点和思路 难点&#xff1a;上面那个带边框的小三角不好实现 思路&#xff1a;画两个不同大小的div&#xff0c;使其基本重叠&#xff08;两个大小不同&#xff0c;不完全重叠&#xff0c;让红色的露出一点边边&#xff09;&#xff0c;让白色div放到最上层&…...

12款 Macmini A1347 跑 Stable Diffusion,20多分钟一张图

设备 2012款 Macmini A1347 12款 mini A1347 跑 Stable Diffusion 要20多分钟一张图 来欣赏一下20分钟画出来的图片 a black and white cat 环境&#xff1a;...

流量控制和拥塞控制的原理和区别

文章目录先介绍下重传机制和滑动窗口超时重传快速重传SACK方法Duplicate SACK滑动窗口发送方缓存窗口接收方缓存窗口流量控制小结拥塞控制慢开始算法拥塞避免算法快重传快恢复先介绍下重传机制和滑动窗口 超时重传 重传机制的其中一个方式&#xff0c;就是发送数据时&#xf…...

金融机构断卡行动中外部数据

“断卡行动”&#xff0c;近几年逐渐走入大众视野&#xff0c;是国家在从根源上整治网络及金融犯罪层面的重大举措。相信很多朋友在日常生活中已经有所体会了&#xff0c;比如我们在办理电话卡及银行卡的时候要经过很多审核机制&#xff0c;同时发卡后还会限制卡片的一些转账等…...

携程总监的单元测试是怎么样写的?

大家都知道&#xff0c;开发软件的时候为代码编写单元测试是很好的。但实际上&#xff0c;光有测试还不够&#xff0c;还要编写好的测试&#xff0c;这同样重要。 要做到这一点&#xff0c;考虑遵循一些固执的原则&#xff0c;对测试代码给予一些关爱&#xff1a; 1. 保持测试…...

算法每日一题:P2089 烤鸡 -DFS练习

&#x1f61a;一个不甘平凡的普通人&#xff0c;日更算法学习和打卡&#xff0c;期待您的关注和认可&#xff0c;陪您一起学习打卡&#xff01;&#xff01;&#xff01;&#x1f618;&#x1f618;&#x1f618; &#x1f917;专栏&#xff1a;每日算法学习 &#x1f4ac;个人…...

Spring中的循环依赖是什么?如何解决它?

循环依赖是指两个或多个Bean之间相互依赖&#xff0c;导致它们无法被正确地初始化。在Spring中&#xff0c;当两个或多个Bean之间存在循环依赖时&#xff0c;Spring容器无法决定哪个Bean应该先初始化&#xff0c;因此会抛出BeanCurrentlyInCreationException异常&#xff0c;从…...

不良事件报告系统源码,PHP医院安全(不良)事件报告系统源码,在大型医院稳定运行多年

PHP医院安全&#xff08;不良&#xff09;事件报告系统源码&#xff0c;不良事件系统源码&#xff0c;有演示&#xff0c;在大型医院稳定运行多年。 系统技术说明 技术架构&#xff1a;前后端分离&#xff0c;仓储模式 开发语言&#xff1a;PHP 开发工具&#xff1a;VSco…...

MySQL 查询常用操作(3)——排序 order by

MySQL中常用的查询操作&#xff0c;首先是能直接从表中直接取出数据&#xff0c;接着能对查询结果做一些简单的处理&#xff0c;比如去重等&#xff0c;然后是根据条件查询数据&#xff0c;包括精准查询、模糊查询以及按照数据的某个范围或者指定多个指标进行查询&#xff0c;值…...

Android Jetpack 从使用到源码深耕【数据库注解Room 从实践到原理 】(二)

上文,我们通过一个简单的sqlite应用实例,引入了Room,知道了Room使用的便捷和好处。然后用Room的方式,重新实现了应用实例中的场景,在这个过程中,我们结合自己已有的知识体系,从使用代码入手,对Room的实现原理,进行了猜想和简单的验证。 Room实现原理,是否真如我们猜想…...

传统企业如何实现数字化转型?

近年来&#xff0c;围绕新产品新模式新业态&#xff0c;国家重点部署了7个方向&#xff0c;包括数字化管理、平台化设计、智能化生产、网络化协同、个性化定制、服务化延伸、新型智能产品等&#xff0c;均为市场价值大、发展潜力深、示范效应强的代表性、引领性领域。 因此&am…...

Linux修改密码报错Authentication token manipulation error的终极解决方法

文章目录报错说明解决思路流程排查特殊权限有没有上锁查看根目录和关闭selinux/etc/pam.d/passwd文件/etc/pam.d/system-auth文件终极办法&#xff0c;手动定义密码passwd: Have exhausted maximum number of retries for servic、ssh用普通用户登录输入密码正确但是登录时却提…...

ROS实践06 自定义消息类型

文章目录运行环境&#xff1a;思路&#xff1a;1.1 定义.msg文件1)功能包下新建 msg 目录&#xff0c;添加文件 Person.msg2)修改package.xml3)修改CMakeLists.txt2.1 自定义消息调用(C)1&#xff09;编译后修改includePath2&#xff09;发布方实现2.1修改CMakeLists.txt2.3运行…...

《剑指offer》——从尾到头打印链表

首先&#xff0c;拿到题之后&#xff0c;我们还是先从题目入手&#xff0c;只有掌握题干的意思&#xff0c;才能进行接下来的解题操作。 示例1 输入 : {1,2,3} 返回值&#xff1a;[3,2,1] 示例2 输入 &#xff1a;{67,0,24,58} 返回值&#xff1a;[58,24,0,67] 解题方法…...

Javaweb基础配置模板(mybatis+javaweb)

1.大纲规划图 本配置涉及的技术:mybatis,javaweb,json转换&#xff0c;分页查询等 2.导入相关的配置文件pom.xml 2.1 依赖文件 <dependencies> <!-- 测试依赖--><dependency><groupId>junit</groupId><artifactId>junit</artifact…...

物联网 JS 前端框架开发 - 执行 js 程序

前言 此篇文章主要讲解如何在物联网操作系统OneOS上运行高级语言JS脚本程序。想想还是有点意思的&#xff0c;毕竟在IOT设备上&#xff0c;我们的固有想法是&#xff0c;他们性能很羸弱&#xff0c;可能就跑跑一些简单的C应用程序&#xff0c;没想到已经可以运行高级语言JS脚本…...

区块链概论

目录 1.概述 2.密码学原理 2.1.hash函数 2.2.签名 3.数据结构 3.1.区块结构 3.2.hash pointer 3.3.merkle tree 3.3.1.概述 3.3.2.证明数据存在 3.3.3.证明数据不存在 4.比特币的共识协议 4.1.概述 4.2.验证有效性 4.2.1.验证交易有效性 4.2.2.验证节点有效性 …...

MAC地址表安全

4.1.2MAC地址表安全 MAC地址表项类型包括:动态MAC地址表项:由接口通过报文中的源MAC地址学习获得,表项可老化。在系统复位、接口板热插拔或接口板复位后,动态表项会丢失。静态MAC地址表项:由用户手工配置并下发到各接口板,表项不老化。在系统复位、接口板热插拔或接口板复…...

观察 Taotoken 在多地域请求下的延迟与稳定性表现

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 观察 Taotoken 在多地域请求下的延迟与稳定性表现 对于依赖大模型 API 进行开发的团队而言&#xff0c;服务的延迟与稳定性是影响开…...

Speechless:三步完成微博PDF备份的终极免费Chrome扩展

Speechless&#xff1a;三步完成微博PDF备份的终极免费Chrome扩展 【免费下载链接】Speechless 把新浪微博的内容&#xff0c;导出成 PDF 文件进行备份的 Chrome Extension。 项目地址: https://gitcode.com/gh_mirrors/sp/Speechless 在数字时代&#xff0c;我们的社交…...

如何在Mac上轻松导出微信聊天记录:WeChatExporter完整指南

如何在Mac上轻松导出微信聊天记录&#xff1a;WeChatExporter完整指南 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因误删重要微信聊天记录而焦虑&#xff1f…...

【限时公开】后印象派专属--ar 16:9 --style raw --stylize 800参数组合包(含塞尚构图/修拉点彩/劳特累克动态线共12套已验证prompt模板)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;后印象派艺术精神与Midjourney风格迁移的本质逻辑 后印象派并非对印象派的简单延续&#xff0c;而是对主观表达、结构重构与象征张力的自觉回归——梵高旋转的星云、塞尚凝练的几何体、高更原始的色域&…...

NVIDIA Profile Inspector完整指南:200+隐藏设置解锁显卡极致性能

NVIDIA Profile Inspector完整指南&#xff1a;200隐藏设置解锁显卡极致性能 【免费下载链接】nvidiaProfileInspector 项目地址: https://gitcode.com/gh_mirrors/nv/nvidiaProfileInspector 还在为游戏画面撕裂、输入延迟过高而烦恼吗&#xff1f;想要彻底掌控NVIDIA…...

低多边形≠简陋!掌握这7个结构化Prompt技巧,3分钟产出可商用IP形象(附Figma网格对齐校验表)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;低多边形设计的认知革命&#xff1a;从“简陋感”到“结构化美学” 低多边形&#xff08;Low-Poly&#xff09;设计曾长期被误读为建模能力不足的妥协产物&#xff0c;但其本质是一场对数字视觉语法的系…...

5分钟免费获取:开源鼠标连点器MouseClick完整使用指南

5分钟免费获取&#xff1a;开源鼠标连点器MouseClick完整使用指南 【免费下载链接】MouseClick &#x1f5b1;️ MouseClick &#x1f5b1;️ 是一款功能强大的鼠标连点器和管理工具&#xff0c;采用 QT Widget 开发 &#xff0c;具备跨平台兼容性 。软件界面美观 &#xff0c;…...

DIY便携FPV地面站:从电路设计到3D打印的完整制作指南

1. 项目概述&#xff1a;为什么需要一个便携式FPV地面站&#xff1f;玩FPV&#xff08;第一人称视角&#xff09;飞行&#xff0c;无论是竞速穿越还是航拍探索&#xff0c;最核心的体验就是那块屏幕。大多数飞手依赖FPV眼镜带来的沉浸感&#xff0c;但在很多场景下&#xff0c;…...

基于Helm Chart的JupyterHub生产级部署与运维实战指南

1. 项目概述&#xff1a;为什么我们需要一个可扩展的JupyterHub部署方案&#xff1f;如果你在团队里负责过数据科学或机器学习平台的搭建&#xff0c;大概率会为Jupyter Notebook的部署和管理头疼过。单个Jupyter Notebook服务给一两个人用还行&#xff0c;一旦团队规模扩大到十…...

CC2530与ESP8266物联网网关:ZigBee转Wi-Fi通信协议转换实战

1. 项目概述&#xff1a;当ZigBee遇上Wi-Fi最近在折腾一个智能家居的传感器节点&#xff0c;核心是TI的CC2530 ZigBee芯片。这玩意儿功耗低、组网方便&#xff0c;是很多低功耗传感网络的绝佳选择。但问题来了&#xff0c;ZigBee网络的数据最终怎么方便地送到我们手机上去看呢&…...