validation的简单使用

首先是依赖
我这里使用的是 web 工程,所以多一个web依赖

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

先尝试一下 项目是否都能跑起来

  1. 新建一个类,很简单对吧
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {private String name;private Integer age;private String mobile;
}
  1. 然后我们的接口如下,也非常简单对吧
@RequestMapping("/validation")
@RestController
public class ValidationController {@PostMapping("/test")public String test(@RequestBody Student student) {System.out.println(student);return "test";}
}
  1. 使用postman请求一下
    在这里插入图片描述
  2. 查看结果
    在这里插入图片描述

ok,下面我们不使用 validation 来校验一下参数,一般我们这么写

    @PostMapping("/test2")public String test2(@RequestBody Student student) {if (student == null) {throw new RuntimeException("student is null");}if (null == student.getAge() ||!StringUtils.hasText(student.getName()) ||!StringUtils.hasText(student.getMobile())) {throw new RuntimeException("parmeter has null value");}if (student.getAge() < 0) {throw new RuntimeException("age is less than 0");}if (student.getMobile().length() != 11) {throw new RuntimeException("mobile length is not 11");}System.out.println(student);return "test";}

看着很麻烦,杂乱,即便是将其抽出去,单成一个方法,也只是眼不见心不烦而已。

下面我们使用 validation 来写

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {@NotBlank(message = "名字不能为空")private String name;@DecimalMax(value = "150", message = "年龄不能大于150,除非您是神仙")@DecimalMin(value = "0", message = "年龄不能小于0,除非您还没出生")private Integer age;private String mobile;
}
    @PostMapping("/test3")//注意看,这里也多了一个@Valid 注解public String test3(@RequestBody @Valid Student student) {System.out.println(student);return "test";}

我们请求一下:
在这里插入图片描述
请求失败,看一下控制台
在这里插入图片描述
虽然实现了,但是我们更希望 我们的报错信息能返回给前端,而不是输出在控制台。
所以我们还需要做一个异常全局捕获处理,我这里写一个简单的

/*异常全局处理*/
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(value = Exception.class)public String exceptionHandler(Exception e) {return e.getMessage();}
}

这样之后,效果如下
在这里插入图片描述

下面我们编写一个自定义的 参数检验方法,就用于我们的 mobile 字段,就比如:必须 11位,并且是数字1开头,这个逻辑是现有的注解实现不了的,只能自己写

那么问题就是怎么写,我们找一个现成的 @NotNull复制一下,改改代码

@Target({ElementType.METHOD, ElementType.FIELD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR,ElementType.PARAMETER, ElementType.TYPE_USE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {MobileValidator.class}//注意,这里是需要我们自己写的
)
public @interface Mobile {String message() default "手机号码有误";Class<?>[] groups() default {};Class<? extends Payload>[] payload() default {};}
public class MobileValidator implements ConstraintValidator<Mobile, String> {/*这两个泛型,前者是注解类型 ,后者是 要检验的值是什么类型*/@Overridepublic boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {/*s就是前端传过来的值*/return StringUtils.hasText(s) && s.length() == 11 && s.startsWith("1");}
}

然后我们将自定义的 Mobile 用起来

@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Student {@NotBlank(message = "名字不能为空")private String name;@DecimalMax(value = "150", message = "年龄不能大于150,除非您是神仙")@DecimalMin(value = "0", message = "年龄不能小于0,除非您还没出生")private Integer age;@Mobile//这里用起来private String mobile;
}

我们请求一下

在这里插入图片描述

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

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

相关文章

10 华三vlan技术介绍

AI 解析 -Kimi-ai Kimi.ai - 帮你看更大的世界 (moonshot.cn) 虚拟局域网&#xff08;VLAN&#xff09;技术是一种在物理网络基础上创建多个逻辑网络的技术。它允许网络管理员将一个物理网络分割成多个虚拟的局域网&#xff0c;这些局域网在逻辑上是隔离的&#xff0c;但实际…

leetCode68. 文本左右对齐

基本思路&#xff1a; leetCode68. 文本左右对齐 代码 class Solution { public:vector<string> fullJustify(vector<string>& words, int maxWidth) {vector<string> res;for(int i 0; i < words.size(); i){ // 枚举有多少个单词int j i 1; //…

年轻人刮疯了,刮刮乐断货了

年轻人刮疯了 刮刮乐缺货了。 00后彩票店老板陆诗等得有点着急。她的福彩店开在深圳&#xff0c;今年4月才开门营业&#xff0c;但从开业到今天&#xff0c;刮刮乐总共就来了一回货——开业时发的20本。 那之后&#xff0c;刮刮乐就彻底断供了。原本&#xff0c;陆诗想把刮刮…

《MySQL数据类型》

文章目录 一、理解数据本身就是一种约束1.tinyint类型和 tinyint unsigned类型2.其他的int类型 二、bit类型三、float类型1.signed版本注意2.unsigned版本 四、decimal类型float 和 decimal 总结五、char类型&#xff08;固定长度&#xff09;六、varchar类型&#xff08;可变长…

【跟马少平老师学AI】-【神经网络是怎么实现的】(四)卷积神经网络

一句话归纳&#xff1a; 1&#xff09;用1个小粒度的模式&#xff0c;逐个与图像的局部区域进行运算&#xff0c;运算结果反映模式与区域的匹配程度。 2&#xff09;卷积神经网络与全连接神经网络的区别&#xff1a; 卷积神经网络的输出只与局部输入有连接。参数较少&#xff0…

N9048B PXE EMI 测试接收机,1 Hz 至 44 GHz

​ _EMI_ N9048B EMI 测试接收机 1 Hz 至 44 GHz Keysight N9048B PXE 是一款符合标准的 EMI 测试接收机&#xff0c;配有射频预选器和 LNA 设计。其实时扫描&#xff08;RTS&#xff09;功能有助于您缩短总体测试时间&#xff0c;轻松执行无间隙的信号捕获和分析。 特点 …

宏电全栈式IoT赋能供排水智能监测,护航城市生命线

城市供水、排水系统是维系城市正常运行、满足群众生产生活需要的重要基础设施&#xff0c;是城市的“生命线”。随着城市化进程加快&#xff0c;城市规模不断扩大&#xff0c;地下管线增长迅速&#xff0c;城市“生命线安全”的监管日益面临挑战。 宏电作为物联网行业的领航者…

Docker本地部署overleaf后,挖掘用户加密逻辑

overleaf的用户信息&#xff0c;保存在mongo数据库的users集合中。 用户密码则存在hashedPassword字段中 从开源的代码services\web\app\src\Features\Authentication\AuthenticationManager.js第303行可以找到密码加密逻辑。 本地可以通过下面的代码生成overleaf用户密码信息…

408数据结构-树与森林 自学知识点整理

前置知识&#xff1a;树的基本概念与性质 树的存储结构 树既可以采用顺序存储结构&#xff0c;又可采用链式存储结构。但无论采取哪种方式&#xff0c;都要求能够唯一地反映树中各结点之间的逻辑关系。 1. 双亲表示法 这种存储结构采用一组连续空间来存储每个结点&#xff0…

JetPack之ViewModel+LiveData

目录 一、概述二、LiveData 使用2.1 创建 LiveData 对象2.2 观察 LiveData 对象2.3 更新 LiveData 对象 三、编写 LiveData Demo3.1 不使用 LiveData3.2 使用 MutableLiveData3.3 使用 MediatorLiveData3.3.1 监听 2 个数据源的变化3.3.2 编写模拟 2 个数据源更新的代码 四、Vi…

java中如何判断一个数是不是素数(质数)

相关概念 质数就是大于1的自然数字中&#xff0c;只能被1和它自己整除的数。 题目 求101~200之间的质素的个数 代码实现 判断一个数是不是质数 for (int j 2; j < i; j) {if(i % j 0){flag false;break;}}if(flag){System.out.println("当前数字是质数");…

Unity 性能优化之遮挡剔除(Occlusion Culling)(六)

提示&#xff1a;仅供参考&#xff0c;有误之处&#xff0c;麻烦大佬指出&#xff0c;不胜感激&#xff01; 文章目录 前言一、遮挡剔除是什么&#xff1f;二、静态遮挡剔除的使用步骤1.标记为遮挡剔除对象2.创建Occlusion Area组件3.烘焙4.Occlusion窗口Bake的参数Smallest Oc…

电子书制作神器,简单操作

​随着数字化时代的到来&#xff0c;电子书籍越来越受到人们的喜爱。而一款优秀的电子翻页书制作软件&#xff0c;则能够帮助你轻松制作出专业级的电子书&#xff0c;让你的阅读体验更加丰富多彩。 今天&#xff0c;我们就来为大家推荐一款优秀的电子翻页书制作软件——FLBOOK在…

全球260多个国家的年通货膨胀率数据集(1960-2021年)

01、数据简介 全球年通货膨胀率是指全球范围内&#xff0c;在一年时间内&#xff0c;物价普遍上涨的比率。这种上涨可能是由于货币过度供应、需求过热、成本上升等原因导致的。通货膨胀率是衡量一个国家或地区经济状况和物价水平的重要指标&#xff0c;通常以消费者价格指数&a…

Flutter笔记:Widgets Easier组件库(12)使用消息吐丝(Notify Toasts)

Flutter笔记 Widgets Easier组件库&#xff08;12&#xff09;使用消息吐丝&#xff08;Notify Toasts&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 29114848416…

如何全面规避医疗数据安全风险?“一中心三大管控域”打开新思路!

作为医院的核心基础设施&#xff0c;数据库已然演变成了一种具有“资产”属性的重要元素。而随着不断变化的医疗业务场景和日趋严格的合规性要求&#xff0c;如何让安全全方位贯穿医疗数据的生命周期&#xff0c;是一项系统性的建设工作&#xff0c;难点诸多。 基于多年的数据…

Vue前端环境准备

vue-cli Vue-cli是Vue官方提供的脚手架&#xff0c;用于快速生成一个Vue项目模板 提供功能&#xff1a; 统一的目录结构 本地调试 热部署 单元测试 集成打包上线 依赖环境&#xff1a;NodeJs 安装NodeJs与Vue-Cli 1、安装nodejs&#xff08;已经安装就不用了&#xff09; node-…

Linux字符设备驱动(二) - 与设备驱动模型的关系

一&#xff0c;从/dev目录说起 从事Linux嵌入式驱动开发的人&#xff0c;都很熟悉下面的一些基础知识&#xff0c; 比如&#xff0c;对于一个char类型的设备&#xff0c;我想对其进行read wirte 和ioctl操作&#xff0c;那么&#xff1a; 1&#xff09;我们通常会在内核驱动中…

tomcat-以服务的方式重启tomcat

背景 双击tomcat的bin目录下面的startup.bat&#xff0c;会留下一个cmd的窗口&#xff0c;很不优雅 使用service服务的方式启动&#xff0c;并且设置为自动启动 找到tomcat的bin目录输入cmd&#xff0c;按Enter&#xff0c;进入命令行界面。执行“service.bat install” 。&…

文件删了,回收站清空了怎么恢复?文件恢复软件一览

在日常生活和工作中&#xff0c;我们常常会遇到误删除文件的情况&#xff0c;有时甚至会因为清空了回收站而无法找回这些文件。这些文件可能包含重要的工作数据、个人照片或其他珍贵的回忆。那么&#xff0c;在这种情况下&#xff0c;我们该如何恢复这些被删除且清空回收站的文…