SpringBoot参数校验@Validated和@Valid的使用

1、@Validated和@Valid区别

  • @Validated:可以用在类、方法和方法参数上。但是不能用在成员属性(字段)上
  • @Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上

2、引入依赖

Spring Boot 2.3 1 之前,只需要引用spring-boot-starter-web

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Spring Boot 2.3 1 之后,spring-boot-starter-validation 已经不包括在了 spring-boot-starter-web 中,需要我们手动加上。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

 


3、示例代码

测试实体类

package com.test.entity;

import javax.validation.constraints.NotBlank;

import lombok.Data;

/**
 * 测试实体类
 */
@Data
public class Test {
	/**
     * 账号
     */
    @NotBlank(message = "登陆账号不能为空")
    private String username;
    /**
     * 密码
     */
    @NotBlank(message = "密码不能为空")
    private String password;

}

 Controller

package com.test.controller;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;

import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.test.entity.Test;

/**  
 * 测试参数校验
 */
@RestController
@RequestMapping("/test")
@Validated
public class TestController {
	
	@RequestMapping(value = "getId", method = RequestMethod.GET)
    public String getId(@NotNull Integer id) {
		return "id: "+id;
	}
	
	@RequestMapping(value = "save", method = RequestMethod.POST)
    public String save(@Valid Test test) {
		System.out.println(test.getUsername());
		return "success";
	}
}


4、验证结果

getId方法

save方法 

 

大家会看到现在的错误提示非常不友好, 我们可以自定义异常返回错误消息

参考文章:SpringBoot注解校验validation自定义异常返回错误消息给前端_自定义校验注解前台如何弹窗提示-CSDN博客

@NotBlank注解String字段会报错_@notblank报错-CSDN博客 

 4、@Validated和@Valid使用情况测试

1.@Validated和@Valid同时使用--结果:验证成功

/**  
 * 1.@Validated和@Valid同时使用--结果:验证成功
 */
@RestController
@RequestMapping("/test")
@Validated
public class TestController {
	
	@RequestMapping(value = "getId", method = RequestMethod.GET)
    public String getId(@NotNull Integer id) {
		return "id: "+id;
	}
	
	@RequestMapping(value = "save", method = RequestMethod.POST)
    public String save(@Valid Test test) {
		System.out.println(test.getUsername());
		return "success";
	}
}

2.@Validated单独使用--结果:getId方法的参数id校验成功,save方法实体校验失效

/**  
 * 2.@Validated单独使用--结果:getId方法的参数id校验成功,save方法实体校验失效
 */
@RestController
@RequestMapping("/test")
@Validated
public class TestController {
	
	@RequestMapping(value = "getId", method = RequestMethod.GET)
    public String getId(@NotNull Integer id) {
		return "id: "+id;
	}
	
	@RequestMapping(value = "save", method = RequestMethod.POST)
    public String save(Test test) {
		System.out.println(test.getUsername());
		return "success";
	}
}

 3.@Valid单独使用--结果:getId方法的参数id校验失效,save方法实体校验成功

/**  
 *  3.@Valid单独使用--结果:getId方法的参数id校验失效,save方法实体校验成功
 */
@RestController
@RequestMapping("/test")
public class TestController {
	
	@RequestMapping(value = "getId", method = RequestMethod.GET)
    public String getId(@NotNull Integer id) {
		return "id: "+id;
	}
	
	@RequestMapping(value = "save", method = RequestMethod.POST)
    public String save(@Valid Test test) {
		System.out.println(test.getUsername());
		return "success";
	}
}

 4.参数id也加上@Valid--结果:getId方法的参数id校验失效,save方法实体校验成功

/**  
 *  4.参数id也加上@Valid--结果:getId方法的参数id校验失效,save方法实体校验成功
 */
@RestController
@RequestMapping("/test")
public class TestController {
	
	@RequestMapping(value = "getId", method = RequestMethod.GET)
	@Validated
    public String getId(@Valid @NotNull Integer id) {
		return "id: "+id;
	}
	
	@RequestMapping(value = "save", method = RequestMethod.POST)
    public String save(@Valid Test test) {
		System.out.println(test.getUsername());
		return "success";
	}
}

 


5、总结

  1. 实体类参数:参数上必须加上@Valid,类上@Validated可加可不加;
  2. 非实体的参数:类上必须加上@Validated;

推荐都加上,如果类上 @Validated不加,万一后期改造添加新参数,可能会忘记注解@Validated

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

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

相关文章

关于SseEmitter(SSE)在本地可以响应,部署到服务器后无法响应的问题

关于SseEmitter(SSE)在本地可以响应&#xff0c;部署到服务器后无法响应的问题 GetMapping(value "/v3/detail", produces MediaType.TEXT_EVENT_STREAM_VALUE) ResponseBody public SseEmitter v3Detail(String id) {SseEmitter emitter new SseEmitter((long) …

Parasoft:正确的静态应用程序安全测试 (SAST) 解决方案

随着软件开发从Web应用扩展到工业物联网&#xff08;IIoT&#xff09;设备&#xff0c;静态应用安全测试&#xff08;SAST&#xff09;越来越有必要从根本上帮助确保软件的功能安全。根据 Forrester Research的研究&#xff0c;网络攻击是近两年安全漏洞的主要来源。因此&#…

玄学调参实践篇 | 深度学习模型 + 预训练模型 + 大模型LLM

&#x1f60d; 这篇主要简单记录一些调参实践&#xff0c;无聊时会不定期更新~ 文章目录 0、学习率与batch_size判断1、Epoch数判断2、判断模型架构是否有问题3、大模型 - 计算量、模型、和数据大小的关系4、大模型调参相关论文经验总结5、训练时模型的保存 0、学习率与batch_s…

多要素气象环境监测站知识科普

随着工业化和城市化的快速发展&#xff0c;气象环境的影响越来越受到人们的关注。为了更好地保护我们的环境&#xff0c;一款WX-CQ12 多要素气象环境监测站应运而生。这款监测站可以全方位地监测气象环境中的温度、湿度、气压、风速、风向、雨量、太阳辐射等重要要素&#xff0…

二维码看视频怎么做?轻松3 步将视频做成二维码

现在用二维码来扫码看视频是一种很流行的方式&#xff0c;这种方式只需要消耗流量就可以在线查看视频内容&#xff0c;无需等待接收或者下载视频就可以获取内容&#xff0c;有效的节省时间和空间。那么能够转换多种格式视频生成二维码的步骤是什么样的呢&#xff1f;其实想要快…

数据库范式1NF-4NF

码和属性 字段是对内而言的&#xff0c;private的 属性是对外而言的&#xff0c;public的 用Java中的类比喻就是一个对像里面定义了很多字段&#xff0c;一般情况下每个字段都有一组对应的getter&setter方法&#xff0c;注意到了吗&#xff0c;字段一般用private修饰&#…

ChatGPT生成的一些有趣的文件管理用python小程序

1. 在前位置中的所有文件夹内增加一个名为 abc 的新文件夹 import osdef create_abc_directories(root_dir.):# 获取当前目录下的所有目录subdirectories [d for d in os.listdir(root_dir) if os.path.isdir(os.path.join(root_dir, d))]# 在每个目录中创建名为abc的子目录f…

解决CentOS下PHP system命令unoconv转PDF提示“Unable to connect or start own listener“

centos系统下&#xff0c;用php的system命令unoconv把word转pdf时提示Unable to connect or start own listene的解决办法 unoconv -o /foo/bar/public_html/upload/ -f pdf /foo/bar/public_html/upload/test.docx 2>&1 上面这个命令在shell 终端能执行成功&#xff0c…

单词拆分 II

题目链接 单词拆分 II 题目描述 注意点 s 和 wordDict[i] 仅有小写英文字母组成wordDict 中所有字符串都 不同词典中的同一个单词可能在分段中被重复使用多次以任意顺序 返回所有这些可能的句子 解答思路 使用深度优先遍历回溯解决本题&#xff0c;每一层从idx开始遍历s&a…

如何搭建外网可访问的Serv-U FTP服务器,轻松远程共享文件!

目录 1. 前言 2. 本地FTP搭建 2.1 Serv-U下载和安装 2.2 Serv-U共享网页测试 2.3 Cpolar下载和安装 3. 本地FTP发布 3.1 Cpolar云端设置 3.2 Cpolar本地设置 4. 公网访问测试 5. 总结 1. 前言 科技日益发展的今天&#xff0c;移动电子设备似乎成了我们生活的主角&am…

SSM6 11-27 SpringMvc过滤器和异常处理

try catch:处理异常 throw/throws:不处理 抛出 jvm中断程序运行 打印错误信息 web:经典三层模型&#xff1a; dao(mapper) service web层 异常抛给web层Controller类的方法&#xff0c;每个方法可能处理异常,可能处理异常代码相似,造成重复代码重复编写 web层再往上抛 …

java设计模式学习之【对象池模式】

文章目录 引言对象池模式简介定义与用途实现方式 使用场景优势与劣势对象池模式在Spring中的应用JDBC对象池示例代码地址小结 引言 对象池模式在资源管理和性能优化方面发挥着重要作用。这种模式通过重复使用已经初始化的对象&#xff0c;而不是频繁创建和销毁&#xff0c;减少…

Python快速实现BMI(身体质量指数)计算器(窗口界面形式)

BMI是身体质量指数&#xff08;Body Mass Index&#xff09;的缩写&#xff0c;是一种衡量人体肥胖程度的指标。它是根据人的身高和体重计算得出的&#xff0c;公式为&#xff1a; BMI 体重&#xff08;kg&#xff09;/ 身高^2&#xff08;m&#xff09; 其中&#xff0c;体…

【JUC】十七、JMM下的三大特性

文章目录 1、JMM的背景2、Java Memory Model3、JMM规范下的三大特性可见性原子性有序性 4、多线程对变量的读写过程5、总结 1、JMM的背景 如图&#xff0c;对于磁盘、内存、CPU等硬件&#xff0c;内存和CPU的运行速度不是一个量级的&#xff0c;不能总让CPU等着内存&#xff0…

Java 数据结构篇-用链表、数组实现栈

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 栈的说明 2.0 用链表来实现栈 2.1 实现栈 - 入栈方法&#xff08;push&#xff09; 2.2 实现栈 - 出栈&#xff08;pop&#xff09; 2.3 实现栈 - 查看栈顶元素…

[个人笔记] Zabbix实现Webhook推送markdown文本

系统工程 - 运维篇 第四章 Zabbix实现Webhook推送markdown文本 系统工程 - 运维篇系列文章回顾Zabbix实现Webhook推送markdown文本前言实施步骤 Zabbix新增报警媒介类型Zabbix给用户新增报警媒介Zabbix修改动作的执行操作和恢复操作验证&测试 参考来源 系列文章回顾 第一章…

赤霞珠葡萄酒的风味特征是怎样的?

赤霞珠最值得注意的特点之一是它在发酵或桶陈酿期间对橡木的亲和力&#xff0c;除了对葡萄的天然高单宁产生软化效果外&#xff0c;香草和香料的独特木材风味还补充了黑醋栗和烟草的天然葡萄风味。 来自云仓酒庄品牌雷盛红酒分享基于赤霞珠的波尔多混合物在225升&#xff08;59…

【vue_1】console.log没有反应

1、打印不出来&#xff1f;2、警告也会出现问题3、插播&#xff1a;如何使用if-else 语句来处理逻辑 1、打印不出来&#xff1f; 要做一个权限不够的弹出消息框 const authority_message () > {ElMessage({type: warrnings,message: 当前用户的权限不够});console.log(he…

neo4j使用之超神之旅

1.查询整个链路中任意一段的关系类型是“department”的链路数据 MATCH path (n)-[r1 *0..7 {relation_type:once2once}]-(m) where id(n)0 and any(x in relationships(path) where type(x)department) return path效果图&#xff1a; 2.查询整个链路中最后一段的关系类型…

ROS报错:RLException:Invalid roslaunch XML Syntax: mismatched tag:

运行roslaunch文件提示&#xff1a; RLException:Invalid roslaunch XML Syntax: mismatched tag: line 45&#xff0c; column 2 The traceback for the exception was written to the log file. j 解决办法&#xff1a; line45 行多了标签&#xff1a;</node> 另外…