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 {
 
    @PostMapping
    public User createUser(@RequestBody @Validated User user) {
        // 处理用户创建逻辑
    }
 
}

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

3.2 在类级别上使用@Validated

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

@RestController
@RequestMapping("/users")
@Validated
public class UserController {
 
    @PostMapping
    public 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";
    }
}

在这里插入图片描述

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

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

相关文章

Leetcode—535. TinyURL 的加密与解密【中等】

2024每日刷题&#xff08;110&#xff09; Leetcode—535. TinyURL 的加密与解密 实现代码 class Solution { public:// Encodes a URL to a shortened URL.string encode(string longUrl) {while(!urlToCode.count(longUrl)) {string code;for(int i 0; i < 6; i) {code…

【EEG信号处理】时频图与时频图的观察

非常快速和松散的介绍频谱和时频分析 当我们看到一个时频图时&#xff0c;我们应该考虑什么&#xff0c;应该有什么样的问题 什么是time-frequency plots 我们知道&#xff0c;左边是在时间维度上&#xff0c;根据电极的变化来绘制的折线图&#xff0c;他在时间维度上的&#…

系统架构20 - 统一建模语言UML(上)

统一建模语言 组成要素事物关系 在目前的软件开发方法中&#xff0c;面向对象的方法占据着主导地位。面向对象方法的主导地位也决定着软件开发过程模型化技术的发展&#xff0c;面向对象的建模技术方法也就成为主导的方法。 公认的面向对象建模语言出现于20世纪70年代中期。从1…

力扣144 二叉树的前序遍历 Java版本

文章目录 题目描述递归方法代码 非递归方法代码 题目描述 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#xff1a; 输入&#xff1a;root [] 输出&#xf…

终于明白了压力/性能测试中的并发、TPS、RT及吞吐量指标

欢迎关注&#xff0c;我们专注于为IT从业者、学生和爱好者提供实用的资源和帮助。 IT开DD那点小事 互联网技术的后花园&#xff0c;更多访问&#xff1a;www.besthub.tech 一、压力测试与性能测试等同吗&#xff1f; 压力测试&#xff1a;在系统正常使用的情况下&#xff0c;能…

使用modbustcp从PLC设备取得的ushort[2] 数据转换为int32大端模式

大端模式理论参考&#xff1a;https://blog.csdn.net/u012166958/article/details/87344366 大端模式&#xff1a;是指数据的高字节保存在内存的低地址中&#xff0c;而数据的低字节保存在内存的高地址中&#xff0c;这样的存储模式有点类似于把数据当成字符串顺序处理&#x…

(杂项笔记)VS Code好用的插件推进

vs code推荐插件 1、IntelliJ IDEA Keybindings2、Chinese (Simplified) Language Pack3、Code Spell Checker4、JavaScript (ES6) code snippets5、Mithril Emmet6、Path Intellisense7、Vue 3 Snippets8、VueHelper9、Auto Close Tag10、Auto Rename Tag11、Beautify12、Brac…

Activity的启动流程

小伙伴们面试的时候是不是被问过Activity的启动流程很多啊。那我们就来看看吧。个人感觉这类文章代码细节太多&#xff0c;反而容易迷失在源码调用之中&#xff0c;从而忽略了Activity启动过程的本质。所以本文就简单地定性地对Activity启动过程进行描述&#xff0c;不会贴上大…

GPT如何在一分钟内完成论文数据分析?

数据上传 PPMAN-AI 01 由于技术限制&#xff0c;目前InfinitePaper AI仅支持上传1份文件&#xff0c;且大小不超过10M。但是&#xff0c;在强大的代码解释器面前&#xff0c;这都是小问题。我们只需要将可能用到的文件打包成压缩文件上传即可&#xff0c;之后要求GPT直接解压…

动画渲染案例 | 《舒克贝塔·五角飞碟》欢乐开年,经典IP唤醒童年回忆

《舒克贝塔五角飞碟》是由杭州童话大王影视有限公司、天津猫眼微影文化传媒有限公司出品&#xff0c;郑亚旗执导和编剧的动画电影。蓝海创意云为该片提供了渲染服务。电影于2023年12月30日正式上映&#xff0c;上映不到一个月时间累计票房突破5000万大关&#xff0c;并被评为“…

css1基础选择器

大纲 一.标签选择器 比较简单&#xff0c;前面直接写目标标签 二.类选择器 应用 例子 三.多类名选择器&#xff08;调用时中间用空格隔开&#xff09; 四.id选择器 应用 五.通配符选择器 应用 六.总结

大模型日报-20240204

刚刚&#xff0c;字节版GPTs「扣子」上线了 https://mp.weixin.qq.com/s/efNjbeK8Zul39nLzQuawCg 在持续一年的大模型热潮之后&#xff0c;「智能体」成为了科技公司们新的押注方向之一。近日&#xff0c;字节跳动正式推出「Coze 扣子」AI Bot 开发平台。任何用户都可以快速、…

数据孤岛是什么?企业如何应对?

数据孤岛指的是数据在组织内部无法自由流通和共享的状态&#xff0c;这种现象不仅影响了业务的高效运作&#xff0c;也威胁着企业的创新和竞争力。本文将深入探讨数据孤岛问题&#xff0c;分析其产生的原因以及对企业的影响&#xff0c;最后提出有效的应对策略。 一、数据孤岛…

npm---设置淘宝镜像时报“certificate has expired“的错误

今天使用vue create my-app 创建项目时&#xff0c;竟然报错&#xff1a; Error: Command failed: npm info vue-cli-version-marker --json --registryhttps://registry.npm.taobao.org npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request t…

速度规划:用s形曲线规划速度------pencv c++绘图(2)

理论篇 应用篇 实现变速规划 #include <iostream> #include <opencv2/opencv.hpp> // 包含OpenCV头文件 #include <chrono> #include <thread>using namespace std;#define _CRT_SECURE_NO_WARNINGS #define a_max 1.0 #define J 0.2 #define v_m…

商家转账到零钱功能申请方法

商家转账到零钱是什么&#xff1f; 商家转账到零钱功能整合了企业付款到零钱和批量转账到零钱&#xff0c;支持批量对外转账&#xff0c;操作便捷。如果你的应用场景是单付款&#xff0c;体验感和企业付款到零钱基本没差别。 商家转账到零钱的使用场景有哪些&#xff1f; 商…

基于YOLOv8的工业油污缺陷检测,多种优化方法---自研新型轻量级的实时检测算法(四)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:详细介绍了工业油污缺陷检测整个过程&#xff0c;从数据集到训练模型到结果可视化分析&#xff0c;以及如何优化提升检测性能。 &#x1f4a1;&#x1f4a1;&#x1f4a1;加入 自研新型轻量级的实时检测算法 mAP0.5由原始…

IDEA创建JavaWeb项目(保姆级别)

文章目录 1.1 原始的 Web 项目1.1.1 创建 Java web 项目1.1.2 完善项目结构1.1.3 依赖添加1.1.4 部署服务器(Tomcat)1.1.5 启动项目 1.2 使用 Maven 创建 Web 项目1.2.1 使用 maven 创建 web1.2.2 配置编译路径和jar包存放位置1.2.3 部署服务器&#xff08;Tomcat&#xff09;1…

2024.2.3

单向循环链表的头插 头删 尾插和尾删 //头结点插入 Linklist insere_element(Linklist head,datatype element) {Linklist screat();s->dataelement;if(NULLhead){heads;}else{Linklist phead;while(p->next!head){pp->next;}s->nexthead;heads;p->nexthead;}r…

【51单片机】开发板&开发软件(Keil5&STC-ISP)简介&下载安装破译传送门(1)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…