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;
    @Valid
    private Address addr;
    @Valid
    private 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 {

    @PostMapping
    public 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)异常数据

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电信网关配置管理系统 rewrite.php 文件上传致RCE漏洞复现

0x01 产品简介 中国电信集团有限公司(英文名称“China Telecom”、简称“中国电信”)成立于2000年9月,是中国特大型国有通信企业、上海世博会全球合作伙伴。电信网关配置管理系统是一个用于管理和配置电信网络中网关设备的软件系统。它可以帮助网络管理员实现对网关设备的远…

力扣HOT100 - 118. 杨辉三角

解题思路&#xff1a; 每个数字等于上一行的左右两个数字之和。 class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> res new ArrayList<>();for (int i 0; i < numRows; i) {List<Integer> …

(done) Beam search

参考视频1&#xff1a;https://www.bilibili.com/video/BV1Gs421N7S1/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 &#xff08;beam search 视频&#xff09; 参考博客1&#xff1a;https://jasonhhao.github.io/2020/06/19/…

鸿蒙ArkUI开发:常用布局【主轴】

ArkUI中常用布局容器 线性布局&#xff08;Row/Column&#xff09; 线性布局的子元素在线性方向上&#xff08;水平方向和垂直方向&#xff09;依次排列线性布局容器包括[Row]和[Column]。Column容器内子元素按照垂直方向排列&#xff0c;Row容器内子元素按照水平方向排列开发…

vc小程序源码:利用opencv 实现九宫格切图

#include "stdafx.h" #include<opencv2/opencv.hpp> using namespace std; using namespace cv;int main() {Mat src imread("福利.png");if (src.empty()){cout << "No Image!" << endl;system("pause");return -…

PCIE协议-2-事务层规范-Completion Rules

2.2.9 完成规则 所有Read、Non-Posted Write和AtomicOp请求都需要完成&#xff08;Completion&#xff09;。完成包含一个完成头标&#xff0c;对于某些类型的完成&#xff0c;完成头标之后会跟随一定数量的DWs数据。完成头标的每个字段的规则在以下各节中定义。 完成通过ID路…

C# WinForm —— 18 NumericUpDown 介绍

1. 简介 数字显示框&#xff0c;通过向上、向下按钮来 增加/减小 显示的数值 2. 常用属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到,一般以 numUD 开头Hexadecimal数值 up-down 控件的值是否应以十六进制显示Increment每单击一下按钮&#xff0c;增加或减…

孙宇晨对话大公网:香港Web3政策友好环境示范意义重大

日前,全球知名华文媒体大公网发布《湾区web3大有可为》重磅系列报道。报道通过对中国香港与大湾区其他城市Web3政策、行业创新和生态建设等方面的梳理,以及对行业领袖和重要行业机构的走访,全面展现了在大湾区一体化发展的背景下,Web3等数字经济模式在该地区的长远发展潜力。 …

ABB机器人程序类型介绍

ABB机器人编程语言为rapid语言&#xff0c;在例行程序中可分为三类&#xff1a;普通程序、功能程序和中断程序。例如新建一个例行程序&#xff0c;会选择一个程序类型&#xff0c;三种类型的区别如下&#xff1a; 1、普通程序&#xff08;procedures&#xff09;&#xff1a;常…

移动 App 入侵与逆向破解技术-iOS 篇

如果您有耐心看完这篇文章&#xff0c;您将懂得如何着手进行app的分析、追踪、注入等实用的破解技术&#xff0c;另外&#xff0c;通过“入侵”&#xff0c;将帮助您理解如何规避常见的安全漏洞&#xff0c;文章大纲&#xff1a; 简单介绍ios二进制文件结构与入侵的原理介绍入…

HUE工具介绍使用

一、HUE工具介绍使用 HUE是CDH提供一个hive和hdfs的操作工具&#xff0c;在hue中编写了hiveSQl也可以操作hdfs的文件 http://hadoop01:9870 hdfs的web访问端口 hdfs://hadoop01:8020 hdfs的程序访问端口 进入hue

基于SpringBoot的垃圾分类网站的设计与实现

一、引言 随着网络不断的普及发展&#xff0c;垃圾分类网站依靠网络技术的支持得到了快速的发展&#xff0c;首先要从用户的实际需求出发&#xff0c;通过了解用户的需求开发出具有针对性的垃圾分类、垃圾图谱等功能&#xff0c;利用目前网络给用户带来的方便快捷这一特点对系统…

springboot+vue+mybatis生活废品回收系统+PPT+论文+讲解+售后

该生活废品回收系统采用B/S架构、前后端分离以及MVC模型进行设计&#xff0c;并采用java语言以及springboot框架进行开发。该系统主要设计并完成了管理过程中的用户登录、个人信息修改、义捐活动、在线咨询、订单评价、废品订单、废品、回收再利用技巧、废品回收员、用户等功能…

MyBatis——模拟MyBatis框架

一、dom4j 解析 XML 文件 在 dom4j 中&#xff0c;DOMReader 和 SAXReader 是两种不同的 XML 解析器。 它们的主要区别在于解析 XML 的方式和所提供的功能&#xff1a; DOMReader&#xff1a; DOMReader 使用 DOM&#xff08;Document Object Model&#xff09;模型来表示整个…

基于MetaGPT的智能体理论与实践-Task01

Task01: MetaGPT环境配置 学习教程&#xff1a;https://github.com/datawhalechina/hugging-multi-agent 1 环境准备 1.1 安装python3.9 通过&#xff1a;python3 --version, 查看此python版本为3.10.3 1.2 下载MetaGPT 开始&#xff0c;借用清华镜像&#xff0c;拉取…

CSS常用滤镜效果

CSS 提供了多种滤镜效果&#xff0c;可以通过 filter 属性应用于 HTML 元素。以下是一些常用的 CSS 滤镜效果&#xff1a; 一、灰度 (Grayscale) 将图像转换为灰度图像。值在 0%&#xff08;原始图像&#xff09;和 100%&#xff08;完全灰度&#xff09;之间。 filter: gra…

ORA-609频繁出现在alert.log,如何解决?

ORA-609就alertlog中比较常见的一个报错&#xff0c;虽然并没有太大的影响&#xff0c;但是频繁的出现在alert log也是很让人厌烦的事情&#xff0c;本文介绍如何排查解决ORA-609问题。 1.ORA-609官方定义 could not attach to incoming connection Cause Oracle process cou…

【话题】Agent AI智能体的未来

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 背景一、Agent AI智能体的角色二、Agent AI智能体的发展路径三、Agent AI智能体可能带来的挑战文章推荐 背景 随着Agent AI智能体的智能化水平不断提高&#xff0c;它们…

centos7.6安装mysql

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;MySQL之旅_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 1.在网页中寻找mysql…

《一》Word文字编辑软件---架构设计分析

1&#xff0c;简单介绍 今天&#xff0c;我们来模拟offic软件中的word文档&#xff0c;运行如图&#xff1a; 运行程序后会出现主界面&#xff0c;顶端的菜单栏包括“文件”“编辑”“格式”“窗口”和“帮助五个主菜单。 菜单栏下面是工具栏&#xff0c;包含了系统常用的功能按…