当前位置: 首页 > 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地址表项:由用户手工配置并下发到各接口板,表项不老化。在系统复位、接口板热插拔或接口板复…...

从零搭建Vulnstack内网靶场:一次完整的渗透测试实战复盘

1. 环境准备与靶场搭建 第一次接触Vulnstack靶场时&#xff0c;我完全被内网渗透的复杂性震撼到了。这个靶场模拟了真实企业内网环境&#xff0c;包含域控制器、Web服务器和普通办公主机等多种设备。搭建过程就像拼装一台精密仪器&#xff0c;每个部件都要准确定位。 靶机环境需…...

用Python可视化理解柯西-施瓦茨不等式:从向量内积到函数空间的几何直觉

用Python可视化理解柯西-施瓦茨不等式&#xff1a;从向量内积到函数空间的几何直觉 数学中的不等式往往蕴含着深刻的几何意义&#xff0c;柯西-施瓦茨不等式就是这样一个连接代数与几何的桥梁。对于数据科学和机器学习的学习者来说&#xff0c;理解这个不等式不仅能夯实数学基础…...

如何用TerminusDB构建语义数据仓库:从零开始的完整指南

如何用TerminusDB构建语义数据仓库&#xff1a;从零开始的完整指南 【免费下载链接】terminusdb TerminusDB is a distributed database with a collaboration model 项目地址: https://gitcode.com/gh_mirrors/te/terminusdb TerminusDB是一款分布式数据库&#xff0c;…...

Kubernetes 自动扩缩容最佳实践

Kubernetes 自动扩缩容最佳实践 一、前言 哥们&#xff0c;别整那些花里胡哨的。Kubernetes 自动扩缩容是保证应用高可用和成本优化的关键&#xff0c;今天直接上硬货&#xff0c;教你如何配置和优化自动扩缩容。 二、扩缩容类型对比 类型适用场景优势劣势HPA水平扩缩容响应…...

Windows 10/11防火墙设置:如何快速开启ICMP协议实现Ping功能(详细图文)

Windows系统ICMP协议配置全指南&#xff1a;从基础原理到高阶应用 在IT运维和开发工作中&#xff0c;网络连通性测试是最基础却又最频繁的需求之一。想象一下这样的场景&#xff1a;你正在部署一个关键服务&#xff0c;却发现客户端无法连接到服务器&#xff1b;或是远程协助同…...

Ollama部署LFM2.5-1.2B-Thinking:轻量模型在边缘设备上的真实性能报告

Ollama部署LFM2.5-1.2B-Thinking&#xff1a;轻量模型在边缘设备上的真实性能报告 1. 模型介绍&#xff1a;专为边缘设备设计的智能助手 LFM2.5-1.2B-Thinking是一个专门为设备端部署优化的文本生成模型&#xff0c;它在LFM2架构基础上进行了深度改进。这个模型最大的特点就是…...

OrangePi 镜像烧录全攻略:从工具选择到实战避坑

1. 烧录工具选择与对比 第一次接触OrangePi开发板时&#xff0c;最让我头疼的就是镜像烧录工具的选择。市面上工具五花八门&#xff0c;每个教程推荐的软件都不一样。经过多次实测&#xff0c;我总结出三款最靠谱的烧录工具&#xff0c;它们各有特点&#xff1a; Win32DiskImag…...

从YOLO到DeepLab:盘点CV任务中那些‘神级’特征融合技巧与避坑指南

从YOLO到DeepLab&#xff1a;盘点CV任务中那些‘神级’特征融合技巧与避坑指南 在计算机视觉领域&#xff0c;特征融合技术就像一位隐形的调音师&#xff0c;默默协调着神经网络中不同层次、不同来源的信息流。当你在目标检测任务中遇到小目标识别率低的问题&#xff0c;或在图…...

MAD与标准差:鲁棒统计中的抗噪利器

1. 为什么我们需要抗噪统计量&#xff1f; 在日常数据分析中&#xff0c;我们经常会遇到一些"不听话"的数据点。比如分析员工薪资时突然冒出几个高管的天价年薪&#xff0c;或者测量温度时混入几个明显错误的极端值。这时候如果直接用传统的标准差来计算离散程度&…...

深度学习模型的绿色优化:Torch-Pruning减少能源消耗的终极指南

深度学习模型的绿色优化&#xff1a;Torch-Pruning减少能源消耗的终极指南 【免费下载链接】Torch-Pruning [CVPR 2023] Towards Any Structural Pruning; LLMs / Diffusion / Transformers / YOLOv8 / CNNs 项目地址: https://gitcode.com/gh_mirrors/to/Torch-Pruning …...