JSR303数据校验 —— @Valid嵌套校验、集合校验

1. 依赖版本

(1)SpringBoot 3.1.11

(2)JDK17

2. @Valid、@Validated 简介

        说明:在Spring框架中@Valid默认不会对集合(List、Set等)内部的元素进行校验,需要将Spring提供的@Validated注解放在controller类上搭配使用。

2.1 @Valid

  • 提供者:validation-api;
  • 使用位置:成员属性、构造函数、方法、方法参数;
  • 分组:不支持;
  • 嵌套校验:支持嵌套校验,@Valid可以使用在成员属性上。

2.2 @Validated

  • 提供者:Spring自定义注解;
  • 使用位置:类、方法、方法参数,不能用于成员属性;
  • 分组:支持分组,参数校验时,根据不同的分组进行不同的校验;
  • 嵌套校验:不支持。

3. 示例

(1)引入依赖

<!-- 数据校验 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId>
</dependency>

(2)实体类

  • Student
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import org.hibernate.validator.constraints.Length;import java.util.List;@Data
public class Student {@NotBlank(message = "编号不能为空")private String id;@NotBlank(message = "名字不能为空")@Length(max = 10,message = "长度不能超过20")private String name;@NotBlank(message = "编号不能为空")private String sex;@NotBlank(message = "编号不能为空")private String age;@Validprivate Address addr;@Validprivate List<Hobby> hobbies;
}
  • Address
import jakarta.validation.constraints.NotBlank;
import lombok.Data;@Data
public class Address {@NotBlank(message = "地址编号不能为空")private String addrId;@NotBlank(message = "城市不能为空")private String city;
}
  • Hobby
import jakarta.validation.constraints.NotBlank;
import lombok.Data;@Data
public class Hobby {@NotBlank(message = "爱好编号不能为空")private String hobbyId;@NotBlank(message = "爱好编号不能为空")private String hobby;
}

(3)数据校验异常处理

import com.wen.vo.ResultVo;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
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.List;
import java.util.Map;
import java.util.Set;@RestControllerAdvice
public class ExceptionCatch {/*** 数据校验异常处理* @param e* @return*/@ExceptionHandler(value= MethodArgumentNotValidException.class)public ResultVo validateException(MethodArgumentNotValidException e){BindingResult bindingResult=e.getBindingResult();Map<String,Object> map=new HashMap<>();List<FieldError> fieldErrors = bindingResult.getFieldErrors();for (FieldError fieldError : fieldErrors) {map.put(fieldError.getField(),fieldError.getDefaultMessage());}return ResultVo.fail("数据校验异常",map);}@ExceptionHandler(value= ConstraintViolationException.class)public ResultVo validateException(ConstraintViolationException e){Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations();Map<String,Object> map=new HashMap<>();for (ConstraintViolation<?> constraintViolation : constraintViolations) {map.put(constraintViolation.getPropertyPath().toString(),constraintViolation.getMessage());}return ResultVo.fail("数据校验异常",map);}
}

3.1 @Valid嵌套校验

3.1.1 controller层

@RestController
@RequestMapping("/stu")
public class StudentController {@PostMappingpublic String addStu(@Valid @RequestBody Student student){System.out.println(student);return "新增成功";}
}

3.1.2 测试

(1)全量数据

(2)异常数据

3.2  @Valid校验集合

3.2.1 controller层

注意:使用@Valid校验集合内部元素需要将Spring提供的@Validated注解放在controller类上搭配使用。

@Validated // 校验入参是集合的数据需要
@RestController
@RequestMapping("/stu")
public class StuController {@PostMapping("/batchAdd")public String batchAddStu(@Valid @RequestBody List<Student> students){System.out.println(students);return "批量新增成功";}
}

3.2.2 测试

(1)全量数据

(2)异常数据

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

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

相关文章

代码随想录 打卡day23,24,25

1 二叉搜索树的最小绝对差 注意审题&#xff0c;题目当值说到是一个二叉搜索树&#xff0c;因此我们只需进行中序遍历即可&#xff0c;然后得到一个有序数组之后进行编辑&#xff0c;统计出来最小差。 class solution{ private:vector<int> vec;void traversal(TreeNode…

cuttag学习笔记

由于课题可能用上cut&tag这个技术&#xff0c;遂跟教程学习一波&#xff0c;记录一下以便后续的学习&#xff08;主要是怕忘了&#xff09; 教程网址cut&tag教程 背景知识&#xff1a;靶标下裂解与标记&#xff08;Cleavage Under Targets & Tagmentation&#xf…

每日互动(个推)与您相约2024 AI+研发数字峰会(AiDD)上海站

伴随着人工智能在众多行业领域的广泛应用及其带来的颠覆性变革&#xff0c;软件的开发模式、方式和实践也将发生巨大的变化。 5月17-18日&#xff0c;2024 AI研发数字峰会&#xff08;AiDD&#xff09;上海站即将重磅开幕。峰会设置了15个主题论坛&#xff0c;策划60精彩议题内…

CoSeg: Cognitively Inspired Unsupervised Generic Event Segmentation

名词解释 1.特征重建 特征重建是一种机器学习中常用的技术&#xff0c;通常用于自监督学习或无监督学习任务。在特征重建中&#xff0c;模型被要求将输入数据经过编码器&#xff08;encoder&#xff09;转换成某种表示&#xff0c;然后再经过解码器&#xff08;decoder&#x…

有了这玩意,分分钟开发公众号功能!

大家好&#xff0c;我是程序员鱼皮。 不论在企业、毕设还是个人练手项目中&#xff0c;很多同学或多或少都会涉及微信相关生态的开发&#xff0c;例如微信支付、开放平台、公众号等等。 一般情况下&#xff0c;我们需要到官网查阅这些模块对应的 API 接口&#xff0c;自己编写…

windows打开防火墙指定端口(局域网访问本地项目)

windows打开防火墙指定端口(局域网访问本地项目) 本地运行了Vue前端项目&#xff0c;部署在5173端口&#xff0c;想让同事从局域网内访问项目&#xff0c;开放本机端口5173允许访问 在 Windows 上使用自带的防火墙&#xff0c;你可以按照以下步骤来允许局域网内其他设备对特定端…

【刷题】一篇文章搞定“位运算”

只要春天不死&#xff0c;就有迎春的花朵年年岁岁开放&#xff0c;生命讲涅槃&#xff0c;生生不息&#xff0c;并会以另一种形式永存。 – 路遥 《平凡的世界》 (◦′ᆺ‵◦) ♬ ✧❥✧.•✧♡✧ ℒℴѵℯ ✧♡✧•.❥ (◦′ᆺ‵◦) ♬ ✧❥✧.•✧♡✧ ℒℴѵℯ ✧♡✧•.❥…

C++——缺省参数与重载函数

目录 ​前言 一.缺省参数 1.1缺省参数概念 1.2缺省参数分类 注意事项&#xff1a; 二.函数重载 2.1函数重载概念 2.2c支持函数重载原理——命名修饰 前言 本篇文章主要讲述c中有关于缺少参数与函数重载的相关概念与实例&#xff0c;以下是本人拙见&#xff0c;如有错误…

Apple store 静安·苹果店欣赏

官网&#xff1a; https://www.apple.com/today/Apple 亚洲第一大商店&#xff1a;Apple 静安零售店现已在上海开幕 静安苹果欣赏

MS31912半桥电机驱动器可pin to pin替代DRV8912

主要特点 工作电压 4.5V-32V 每个半桥支持1A电流&#xff0c;并联输出支持6A最大电流 支持3.3V和5V逻辑输入 低功耗睡眠模式 (1.5μA) 带菊花链功能的5MHz 16位SPI通信 可通过SPI&#xff0c;配置PWM发生器的频率和占空比 集成多种保护和诊断功能nFAULT引脚输出、VM欠压锁定 、…

家政服务新体验——家政小程序开发,让生活更轻松!

一、引言 随着现代生活节奏的加快&#xff0c;家政服务已经成为越来越多家庭不可或缺的一部分。然而&#xff0c;传统家政服务方式往往存在预约不便、服务质量参差不齐等问题。为了解决这些问题&#xff0c;我们精心打造了一款家政小程序&#xff0c;为您带来全新的家政服务体…

电子作业指导书系统如何提升医疗设备工厂的生产效率

在医疗设备工厂中&#xff0c;电子作业指导书&#xff08;ESOP&#xff09;正逐渐成为提升生产效率的关键因素。 一、电子作业指导书系统提供了即时可得的准确信息。 电子作业指导书系统与传统的纸质作业指导书相比&#xff0c;员工可以在工作现场通过电子设备随时查阅最新、最…