SpringBoot注解--06--注解@Validated

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 1 简述
    • 1.1 @Validated作用
    • 1.2 所有参数注解含义
    • 1.3 异常处理
    • 1.4 @Valid和@Validated比较
      • @Valid级联校验
  • 2.@Validated 分组校验
    • 1.1为何要分组校验?
    • 1.2 代码案例
    • 1.3 @Validated分组校验顺序
        • 分组校验顺序通过==使用 @GroupSequence注解==实现
  • 3.@Validated的使用方法
    • 3.1 在方法级别上使用@Validated
    • 3.2 在==类级别==上使用@Validated
    • 3.2 Get请求参数校验


1 简述

  • @Validated是Spring框架中的一个注解,它是JSR-303规范的扩展,可以用于在方法级别上校验方法参数。
  • 它可以用于验证请求参数和请求体中的数据。@Validated注解可以用于方法级别和类级别上,用于验证方法参数和类属性。

1.1 @Validated作用

@Validation是一套帮助我们继续对传输的参数进行数据校验的注解,通过配置Validation可以很轻松的完成对数据的约束

  • @Validated作用在类、方法和参数上

在这里插入图片描述

1.2 所有参数注解含义

在这里插入图片描述

1.3 异常处理

错误的状态码:返回的响应码推荐使用400 bad request.

说明:若不做异常处理,@Validated注解的默认异常消息如下(示例):

2020-09-05 21:48:38.106  WARN 9796 --- [nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : 
Resolved [org.springframework.web.bind.MethodArgumentNotValidException: 
Validation failed for argument [0] in public java.lang.String com.example.validateddemo.controller.DemoController.validatedDemo1(com.example.validateddemo.entity.dto.UseDto):[Field error in object 'useDto' on field 'username': rejected value [null]; codes [NotBlank.useDto.username,NotBlank.username,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [useDto.username,username]; arguments []; default message [username]]; default message [用户名不能为空!]] ]
package com.example.validateddemo.handler;import com.example.validateddemo.base.Result;
import com.example.validateddemo.enums.ResultEnum;
import com.example.validateddemo.utils.ResultUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import java.util.List;@Slf4j
@ControllerAdvice
public class ValidatedExceptionHandler {/*** 处理@Validated参数校验失败异常* @param exception 异常类* @return 响应*/@ResponseBody@ResponseStatus(HttpStatus.BAD_REQUEST)@ExceptionHandler(MethodArgumentNotValidException.class)public Result exceptionHandler(MethodArgumentNotValidException exception){BindingResult result = exception.getBindingResult();StringBuilder stringBuilder = new StringBuilder();if (result.hasErrors()) {List<ObjectError> errors = result.getAllErrors();if (errors != null) {errors.forEach(p -> {FieldError fieldError = (FieldError) p;log.warn("Bad Request Parameters: dto entity [{}],field [{}],message [{}]",fieldError.getObjectName(), fieldError.getField(), fieldError.getDefaultMessage());stringBuilder.append(fieldError.getDefaultMessage());});}}return ResultUtil.validatedException(stringBuilder.toString());}
}

1.4 @Valid和@Validated比较

Spring Boot–09–注解@Valid

在这里插入图片描述

  • @Valid支持级联校验,而@Validated不行
  • @Validated支持分组校验,而@Valid不行

@Valid级联校验

级联校验: 也叫嵌套检测.嵌套就是一个实体类包含另一个实体类
@Valid和可以用在成员属性的字段上,因此 @Valid可以提供级联校验

@Data
public class Hair {@NotBlank(message = "头发长度必须提交!")private Double length;@NotBlank(message = "头发颜色必须提交!")private String color;
}@Data
public class Person {@NotBlank(message = "用户姓名必须提交!")@Size(min=2, max=8)private String userName;// 添加@Valid注解实现嵌套检测@Valid@NotEmpty(message = "用户要有头发!")private List<Hair> hairs;
}@PostMapping("/person")
public Result addPerson(@Valid @RequestBody Person person) {return Result.buildSuccess(person);
}

只是在方法参数前面添加 @Valid和 @Validated注解,不会对嵌套的实体类进行校验.要想实现对嵌套的实体类进行校验,需要在嵌套的实体类属性上添加 @Valid注解

2.@Validated 分组校验

1.1为何要分组校验?

假设有这样一种场景:

我们使用同一个VO(Request)类来传递save和update方法的数据,

  • 但对于save方法来说,通常有框架帮我们生成id,我们不需要传id此时需要使用注解@Null表名id数据必须为空。
  • 但对于update方法,我们必须传id才能进行update操作,所以同一个字段面对不同的场景不同需求就可以使用分组校验。

1.2 代码案例

(1)创建分组接口
这里并不需要实现编写什么代码,标明分类。

//分组接口 1
public interface InsertGroup {
}//分组接口 2
public class UpdateGroup {
}

(2)Request实体类

@Data
@NoArgsConstructor
public class TestRequest {@Null(message = "无需传id",groups = InsertGroup.class)@NotBlank(message = "必须传入id",groups = UpdateGroup.class)private String id;}

(3)controller接口

	@RequestMapping("/valid/test")public ResponseEntity<ResponseResult> test(@Validated({UpdateGroup.class})@RequestBody TestRequest request) {System.out.println(request);return null;}

(4)postman测试
在这里插入图片描述
(5)注意事项!!!
当我们在controller层指定分组后,属性上没有表名分组的校验还执行么?

下面的Request实体中,id进行了分组,address没有进行分组:

@Data
@NoArgsConstructor
public class TestRequest {@Null(message = "无需传id",groups = InsertGroup.class)@NotBlank(message = "必须传入id",groups = UpdateGroup.class)private String id;@Length(max = 3, message = "address最大长度是3")private String address;}

postman测试:

如下图,校验没有成功!!!!说明一旦开启了分组校验,就必须把所有的校验规则都指定组别,不然不生效

在这里插入图片描述

1.3 @Validated分组校验顺序

默认情况下,分组间的约束是无序的,但是在一些特殊的情况下可能对分组间的校验有一定的顺序

  • 比如第二组的分组的约束的校验需要依赖第一组的稳定状态来进行,此时,要求分组间的约束校验一定要有顺序
分组校验顺序通过使用 @GroupSequence注解实现
@Data
public class UserGroupSequence {public interface FirstGroup {}public interface SecondGroup {}// 使用GroupSequence定义分组校验顺序:按照FirstGroup,SecondGroup分组顺序进行校验@GroupSequence({FirstGroup.class, SecondGroup.class})public interface Group {}@NotEmpty(message = "用户ID必须提交!", group = FirstGroup.class)private String userId;@NotEmpty(message = "用户姓名必须提交!", group = FirstGroup.class)@Size(min = 2, max = 8, message = "用户姓名的长度在2~8之间", goup = Second.class)private String userName;
} 

Controller

@RestController
@RequestMapping("/user")
public class UserGroupSequenceController {// 这里方法中@Validated注解value的值是Group.class@PostMapping("/user")public Result addGroup(@Validated(value = Group.class) @RequestBody UserGroupSequence user) {return Result.buildSuccess(user);}
}

使用 @GroupSequence注解指定分组校验顺序后,第一组分组的约束的校验没有通过后,就不会进行第二组分组的约束的校验

3.@Validated的使用方法

3.1 在方法级别上使用@Validated

在方法级别上使用@Validated注解,需要在方法参数上添加该注解。下面是一个简单的示例,演示了如何在方法级别上使用@Validated注解。

@RestController
@RequestMapping("/users")
public class UserController {@PostMappingpublic User createUser(@RequestBody @Validated User user) {// 处理用户创建逻辑}}

在上面的示例代码中,@Validated注解被应用在User对象上,用于验证请求体中的数据是否符合要求。

3.2 在类级别上使用@Validated

在类级别上使用@Validated注解,需要在类上添加该注解。下面是一个简单的示例,演示了如何在类级别上使用@Validated注解。

@RestController
@RequestMapping("/users")
@Validated
public class UserController {@PostMappingpublic User createUser(@RequestBody User user) {// 处理用户创建逻辑}}

在上面的示例代码中,@Validated注解被应用在UserController类上,用于验证该类中所有方法的参数是否符合要求

3.2 Get请求参数校验

get参数校验,需要在类上加@Validated

@RestController
@Slf4j
@RequestMapping("/api/test")
@Validated
public class TestController {@GetMapping(value = "/h11")public String test11( @NotEmpty(message = "姓名不能为空") String name) {System.out.println("kaidsd");System.out.println(name);return "applyInfoDTO";}
}

在这里插入图片描述

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

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

相关文章

洞察数字未来:2023年腾讯全球数字生态大会全景解析

随着数字技术的飞速发展&#xff0c;全球正步入一个全新的数字生态时代。作为业界瞩目的科技盛会&#xff0c;2023年腾讯全球数字生态大会汇聚了众多行业领袖、技术专家和创新者&#xff0c;共同探讨数字生态的最新趋势、挑战和机遇。 本文将从大会的核心议题、分享内容及其价值…

【SpringBoot】模板设计模式应用

一、前言 常见的设计模式有23种&#xff0c;我们不得不提到模板方法设计模式&#xff0c;这是一种在软件开发中广泛使用的行为型设计模式之一。 二、模板方式是什么 全称是模板方法设计模式。 模板模式是一种行为设计模式。它的实现思路是&#xff0c;创建一个 模板方法 me…

【C语言】static关键字的使用

目录 一、静态本地变量 1.1 静态本地变量的定义 1.2 静态本地变量和非静态本地变量的区别 二、静态函数 2.1 静态函数的定义 2.2 静态函数与非静态函数的区别 三、静态全局变量 3.1 静态全局变量的定义 3.2 静态全局变量和非静态全局变量的区别 四、静态结构体变量 …

机器学习6-逻辑回归

逻辑回归是机器学习中一种常用于二分类问题的监督学习算法。虽然名字中包含“回归”,但实际上它用于分类任务,特别是对于输出为两个类别的情况。逻辑回归通过使用 logistic 函数将输入映射到一个在0,1范围内的概率值,然后根据这个概率值进行分类。 以下是逻辑回归的基本概念…

Kafka系列(一)【消息队列、Kafka的基本概念、Kafka的工作机制、Kafka可满足的需求、Kafka的特性、Kafka的应用场景】

kafka系列 一 一、消息队列1. 消息队列的来源2. 什么是消息队列3. 消息队列主要有哪些作用 二、Kafka的基本概念代理、生产者、消费者、消费者组主题、分区、副本、记录 三、了解 Kafka的工作机制-生产消息/消费消息四、Kafka可满足的需求五、Kafka的特性六、Kafka的场景 转自《…

[MFC] MFC消息机制的补充

之前写了[MFC] 消息映射机制的使用和原理浅析&#xff0c;还有些需要补充的&#xff0c;都记在这里。 MFC 消息的分类 MFC消息分为系统消息和自定义消息。 图片来源&#xff1a;C语言/C教程 大型源码案例分析&#xff1a;MFC消息系统的代码解析 易道云编程 系统消息分为窗口…

【前沿技术杂谈:开源软件】引领技术创新与商业模式的革命

【前沿技术杂谈&#xff1a;开源软件】引领技术创新与商业模式的革命 开源软件如何推动技术创新开源软件的开放性和协作精神促进知识共享和技术迭代推动关键技术的发展开源软件与新技术的融合 开源软件的商业模式开源软件的商业模式将开源软件与商业软件相结合 开源软件的安全风…

2023年哪个前端框架用的最多?

2023 年&#xff0c;TypeScript 的每月下载量持续稳定增长&#xff0c;年度累计下载量高达2,071,832,110&#xff08;20.7 亿&#xff09;&#xff0c;展现了强大的市场需求和用户认可。 本文来通过详细的数据&#xff08;2023 年 npm 累计下载量&#xff09;&#xff0c;看看…

idea中找到所有的TODO

idea中找到所有的TODO &#xff08;1&#xff09;快捷键 Alt6 &#xff08;2&#xff09;View -> Tool Windows -> TODO

LNMP.

一.mysl配置 1.安装mysql yum install mysql-server -y 2.进入mysql配置文件目录 cd /etc/my.cnf.d3.编辑mysql配置文件 vim mysql-server.cnf 在[mysqld]中添加: character-set-serverutf84.启动mysql服务 systemctl start mysqld5.登入mysql mysql 6.创建数据库 cre…

2023年09月CCF-GESP编程能力等级认证Python编程五级真题解析

Python等级认证GESP(1~6级)全部真题・点这里 一、单选题(共15题,共30分) 第1题 近年来,线上授课变得普遍,很多有助于改善教学效果的设备也逐渐流行,其中包括比较常用的手写板,那么它属于哪类设备?( ) A:输入 B:输出 C:控制 D:记录 答案:A 第2题 以下关于…

【Django】Cookie和Session的使用

Cookies和Session 1. 会话 从打开浏览器访问一个网站&#xff0c;到关闭浏览器结束此次访问&#xff0c;称之为一次会话。 HTTP协议是无状态的&#xff0c;导致会话状态难以保持。 Cookies和Session就是为了保持会话状态而诞生的两个存储技术。 2. Cookies 2.1 Cookies定…

新产品!可视化试卷搭建平台

hi, 大家好, 我是徐小夕. 之前和大家分享了很多可视化低代码和零代码的技术实现和产品设计思路, 也和大家分享了 H5-Dooring 零代码搭建平台的技术实现和未来规划, 今天继续和大家分享一下我们的新产品——橙子试卷. 橙子试卷 是一款可视化试卷/问卷搭建平台, 我们可以通过拖拽…

HttpRunner自动化测试之实现参数化传递

参数化实现及重复执行 参数化测试&#xff1a;在接口测试中&#xff0c;为了实现不同组数据对同一个功能模块进行测试&#xff0c;需要准备多组测试数据对模块进行测试的过程。 在httprunner中可以通过如下方式实现参数化&#xff1a; 1、在YAML/JSON 中直接指定参数列表 2、…

【HarmonyOS应用开发】ArkUI 开发框架-进阶篇-应用弹窗(十一)

一、应用弹窗 1、概述 在我们日常使用应用的时候&#xff0c;可能会进行一些敏感的操作&#xff0c;比如删除联系人&#xff0c;这时候我们给应用添加弹窗来提示用户是否需要执行该操作&#xff0c;如下图所示&#xff1a; 弹窗是一种模态窗口&#xff0c;通常用来展示用户…

树状数组复习

基本原理 树状数组的原理简单来说就是利用二进制拆分区间 我们可以对一个数进行二进制分解&#xff0c;最多分解成log(x)个数&#xff0c;同样我们可以对[1,n]这个区间进行分解。也是最多log段&#xff0c;每次修改时我们维护受到影响的区间&#xff0c;然后查询时用这log个区…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--大模型、扩散模型、视觉

专属领域论文订阅 关注{晓理紫|小李子}&#xff0c;每日更新论文&#xff0c;如感兴趣&#xff0c;请转发给有需要的同学&#xff0c;谢谢支持 如果你感觉对你有所帮助&#xff0c;请关注我&#xff0c;每日准时为你推送最新论文。 为了答谢各位网友的支持&#xff0c;从今日起…

论文阅读:Learning Lens Blur Fields

这篇文章是对镜头模糊场进行表征学习的研究&#xff0c;镜头的模糊场也就是镜头的 PSF 分布&#xff0c;镜头的 PSF 与物距&#xff0c;焦距&#xff0c;光学系统本身的像差都有关系&#xff0c;实际的 PSF 分布是非常复杂而且数量也很多&#xff0c;这篇文章提出用一个神经网络…

数仓建模维度建模理论知识

0. 思维导图 第 1 章 数据仓库概述 1.1 数据仓库概述 数据仓库是一个为数据分析而设计的企业级数据管理系统。数据仓库可集中、整合多个信息源的大量数据&#xff0c;借助数据仓库的分析能力&#xff0c;企业可从数据中获得宝贵的信息进而改进决策。同时&#xff0c;随着时间的…

算法42:天际线问题(力扣218题)---线段树

218. 天际线问题 城市的 天际线 是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度&#xff0c;请返回 由这些建筑物形成的 天际线 。 每个建筑物的几何信息由数组 buildings 表示&#xff0c;其中三元组 buildings[i] [lefti, righti, heig…