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)@Validatedpublic 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

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

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

相关文章

Linux多线程基本概念

目录 ​编辑 1.什么是进程&#xff0c;线程&#xff0c;并发&#xff0c;并行 优点 缺点 什么资源是线程应该私有的呢 为什么线程切换成本更低呢 3.线程控制 pthread_create lpthread选项 makefile 代码实现 ps -aL 什么是LWP 轻量级进程ID与进程ID之间的区别 LWP与pthr…

软件测试行情堪忧,测试行业将迎来低谷?

前两天跟一个HR朋友聊天&#xff0c;她表示刚在boss上发布了一个普通测试岗位&#xff0c;不到一小时竟然收到了几百份简历。而且简历质量极高&#xff0c;这是往年不敢想象的。岗位少&#xff0c;竞争激烈&#xff0c;这是今年软件测试就业的真实写照&#xff0c;也是所有岗位…

SWT技巧

实现控件的刷新 问题可以简化如下&#xff0c;点击上方按钮&#xff0c;使下方按钮移动&#xff0c;但要求在监听事件里新建按钮对象&#xff0c;而不是使用原来的按钮&#xff08;原来的按钮被移除了&#xff09;。 解决代码如下&#xff1a; public class TestUI {protecte…

【高效开发工具系列】PlantUML入门使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

SpringBoot : ch07 整合websocket

前言 当涉及到在Spring Boot应用程序中整合WebSocket时&#xff0c;我们可以使用Spring框架提供的功能来实现实时双向通信。WebSocket是一种在Web浏览器和服务器之间进行全双工通信的协议&#xff0c;它允许服务器主动向客户端发送消息&#xff0c;而不需要客户端发起请求。 …

387. 字符串中的第一个唯一字符

387. 字符串中的第一个唯一字符 描述 : 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 题目 : 387. 字符串中的第一个唯一字符 分析 : 我们可以对字符串进行两次遍历&#xff0c;在第一次遍…

Redis原理之五种数据类型笔记

目录 String List Set ZSet ​ Hash String List Set ZSet Hash

Shell脚本:Linux Shell脚本学习指南(第二部分Shell编程)四

第二部分&#xff1a;Shell编程&#xff08;四&#xff09; 三十一、Shell test命令&#xff08;Shell []&#xff09;详解&#xff0c;附带所有选项及说明 test 是 Shell 内置命令&#xff0c;用来检测某个条件是否成立。test 通常和 if 语句一起使用&#xff0c;并且大部分…

RHEL开发者授权注册

$ sudo subscription-manager register --usernameusername --passwordpassword$ sudo subscription-manager attach --auto查看是否注册 Red Hat 订阅管理&#xff0c;请运行以下命令&#xff1a; $ sudo subscription-manager list --installed

【数据库】执行计划中的两趟算法机制原理,基于排序算法来分析,算法的限制,执行代价以及优化

基于排序的两趟算法 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏会定…

Java计算二叉树从根节点到叶子结点的最大路径和

要求从根节点到叶子结点的最大路径和&#xff0c;可以通过递归遍历二叉树来实现。对于二叉树中的每个节点&#xff0c;我们都可以考虑包含该节点的最大路径和。在递归的过程中&#xff0c;我们需要不断更新全局最大路径和。 具体的思路如下&#xff1a; 递归函数设计&#xff1…

服务化通信OPC实操

实操也是基于视频进行一些笔记&#xff0c;没得写就少写了 准备 Nuget包准备&#xff1a;OPCfoundation 一般都是使用Ua&#xff0c;当然也是有&#xff1a; 客户端链接服务器参数&#xff1a;IP Port 认证 登录用户名 Session 的实例化创建 进行使用&#xff1a; 因为Ses…

数据中台具体是怎么解决数据孤岛的?_光点科技

在数字化时代&#xff0c;数据已成为企业的核心资产。然而&#xff0c;由于历史遗留问题、部门壁垒等因素&#xff0c;很多企业面临着“数据孤岛”的问题。数据孤岛是指在一个组织内&#xff0c;数据被分散在不同的系统中&#xff0c;彼此隔离&#xff0c;不能有效整合和利用。…

【版本管理 | Git 】Git最佳实践系列(一) —— LFS .gitignore 最佳实践,确定不来看看?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

python subprocess

查看python官方文档&#xff1a;最全 p subprocess.Popen([rpng2bdf.exe,[r-o .\tst\myfont.bdf -f myfont -e 65 tst\*.png]],stdoutsubprocess.PIPE,stderr subprocess.PIPE) out,err p.communicate() print(out) 注意&#xff0c;如何将shell命令分解为参数序列可能并…

【文末送书】程序员如何化解35岁危机?

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

报表生成器Stimulsoft用户手册:深入报告

Stimulsoft Reports 是一款报告编写器&#xff0c;主要用于在桌面和Web上从头开始创建任何复杂的报告。可以在大多数平台上轻松实现部署&#xff0c;如ASP.NET, WinForms, .NET Core, JavaScript, WPF, Angular, Blazor, PHP, Java等&#xff0c;在你的应用程序中嵌入报告设计器…

canvas基础:绘制线段,绘制多边形

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 使用…

【Linux】第二十一站:文件(一)

文章目录 一、共识原理二、C系列文件接口三、从C过渡到系统&#xff1a;文件系统调用四、访问文件的本质 一、共识原理 文件 内容 属性 文件分为打开的文件 和 没打开的文件 打开的文件&#xff1a;是谁打开的&#xff1f;是进程&#xff01;----所以研究打开的文件本质是研…

使用群晖Synology Office提升生产力:如何多人同时编辑一个文件

使用群晖Synology Office提升生产力&#xff1a;多人同时编辑一个文件 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 文章目录 使用群晖Synol…