SprintBoot使用Validation
1、为什么要使用Validation
在开发过程中有没有使用一堆的if来判断字段是否为空、电话号码是否正确、某个输入是否符合长度等对字段的判断。这样的代码可读性差,而且还不美观,那么使用Validation就可以完美解决这个问题。
2、使用Validation
- 引入validation依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
- 在需要校验的实体类添加注解
@Data
public class User {
private String id;
@NotNull(message = "姓名不能为空")
private String name;
}
- 在Controller类的方法入参增加@Valid
@PostMapping(path = "")
public RestResponse save(@Valid @RequestBody User user){
return ResponseFactory.getOkResponse();
}
- 使用全局异常处理异常信息
全局异常处理在上一篇文章有介绍到,具体怎么使用可以参考:SpringBoot全局异常处理
@ExceptionHandler(MethodArgumentNotValidException.class)
public RestResponse paramExceptionHandler(MethodArgumentNotValidException e) {
BindingResult bindingResult = e.getBindingResult();
if (bindingResult.hasErrors()) {
List<ObjectError> objectError = bindingResult.getAllErrors();
if (!objectError.isEmpty()) {
return ResponseFactory.getErrorMessage(objectError.stream().map(obj -> {
FieldError fieldError = (FieldError) obj;
return String.format("%s-%s", fieldError.getField(), fieldError.getDefaultMessage());
}).collect(Collectors.joining(";")));
}
}
return ResponseFactory.getErrorMessage("参数请求错误!");
}
3、测试
入参:
{
"id":"as",
"name":null
}
出参:
{
"code": "1",
"message": "name-姓名不能为空",
"data": null
}
从出参可以看出,验证已经生效。这里需要注意的是,如果实体类中嵌套了实体类,需要在嵌套的类上加@Valid才会对嵌套的实体类校验。
@Data
public class User {
private String id;
@NotNull(message = "姓名不能为空")
private String name;
@NotNull(message = "地址信息不能为空!")
private Address address;
}
@Data
public class Address {
private String id;
@NotEmpty(message = "省份不能为空!")
private String province;
}
如上只是在address上面加了非空校验,在Address类中的province添加了非空校验,如果不再address加@Valid,入参不传入address信息,如下:
入参:
{
"id":"as",
"name":null
}
出参:
{
"code": "1",
"message": "name-姓名不能为空;address-地址信息不能为空!",
"data": null
}
入参加上address的空信息,入参出参如下:
入参:
{
"id":"as",
"name":null,
"address":{
}
}
出参:
{
"code": "1",
"message": "name-姓名不能为空",
"data": null
}
可以看出在address上不加@Valid注解,对嵌套类的校验是不生效的,接下来@Valid注解加上看下结果:
@Data
public class User {
private String id;
@NotNull(message = "姓名不能为空")
private String name;
@NotNull(message = "地址信息不能为空!")
@Valid
private Address address;
}
入参不变,出参如下:
{
"code": "1",
"message": "address.province-省份不能为空!;name-姓名不能为空",
"data": null
}
从结果可以看出,嵌套类中的校验已经生效。
上面的示例只用到了@NotNull、@NotEmpty注解,还有一些常用的注解,这里就不一一演示了,可以自己测试下。下面贴出一些常用校验注解:
| 注解 | 作用 |
|---|---|
| @NotNull | 值不能为空 |
| @Null | 值必须为空 |
| @Pattern(regex=) | 字符串必须匹配正则表达式 |
| @Size(min, max) | 集合或者数组元素的数量必须在min和max之间 |
| @CreditCardNumber(ignoreNonDigitCharacters=) | 字符串必须是信用卡号,按找美国的标准验证 |
| 字符串必须是Email地址 | |
| @Length(min, max) | 检查字符串的长度 |
| @NotBlank | 字符串不能为空串 |
| @NotEmpty | 字符串不能为null, 集合或者数组的 size 不能为空 |
| @Range(min, max) | 数字必须大于min, 小于max |
| @SafeHtml | 字符串必须是安全的html |
| @URL | 字符串必须是合法的URL |
| @AssertFalse | 值必须是false |
| @AssertTrue | 值必须是true |
| @DecimalMax(value=, inclusive=) | 值必须小于等于(inclusive=true)/小于(inclusive=false)属性指定的值,也可以注释在字符串类型的属性上。 |
| @DecimalMin(value=, inclusive=) | 值必须大于等于(inclusive=true)/小于(inclusive=false)属性指定的值,也可以注释在字符串类型的属性上。 |
| @Digist(integer=,fraction=) | 数字格式检查。integer指定整数部分的最大长度,fraction指定小数部分的最大长度 |
| @Future | 时间必须是未来的 |
| @Past | 事件必须是过去的 |
| @Max(value=) | 值必须小于等于value指定的值。不能注解在字符串类型属性上。 |
| @Min(value=) | 值必须小于等于value指定的值。不能注解在字符串类型属性上。 |
SprintBoot使用Validation的更多相关文章
- jQuery学习之路(8)- 表单验证插件-Validation
▓▓▓▓▓▓ 大致介绍 jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法,包括 ...
- jQuery- 表单验证插件-Validation
▓▓▓▓▓▓ 大致介绍 jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法, ...
- 交叉验证(Cross Validation)原理小结
交叉验证是在机器学习建立模型和验证模型参数时常用的办法.交叉验证,顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏. ...
- MVC学习系列13--验证系列之Remote Validation
大多数的开发者,可能会遇到这样的情况:当我们在创建用户之前,有必要去检查是否数据库中已经存在相同名字的用户.换句话说就是,我们要确保程序中,只有一个唯一的用户名,不能有重复的.相信大多数人都有不同的解 ...
- MVC学习系列12---验证系列之Fluent Validation
前面两篇文章学习到了,服务端验证,和客户端的验证,但大家有没有发现,这两种验证各自都有弊端,服务器端的验证,验证的逻辑和代码的逻辑混合在一起了,如果代码量很大的话,以后维护扩展起来,就不是很方便.而客 ...
- jQuery Validation Engine 表单验证
功能强大的 jQuery 表单验证插件,适用于日常的 E-mail.电话号码.网址等验证及 Ajax 验证,除自身拥有丰富的验证规则外,还可以添加自定义的验证规则. 兼容 IE 6+, Chrome, ...
- 架构验证过程发现非数据类型错误 validation found non-data type errors
问题: infopath报一下错误 validation found non-data type errors 架构验证过程发现非数据类型错误 原因: 重复表字段在后台代码里要一一对应,否则报错. 错 ...
- ORA-19563: header validation failed for file
在测试服务器还原数据库时遇到了ORA-19563错误.如下所示 RMAN-00571: ======================================================== ...
- [WPF系列]-Data Validation
项目经常前台界面涉及到用户输入时,我们常常会用到数据有效性的验证.在网页中我们之前用js来校验Form中的数据有效性.在WPF中我们如何实现这种验证机制了?答案:INotifyDataErrorInf ...
随机推荐
- x64dbg 条件断点相关文档
输入 字符格式 条件断点 Input When using x64dbg you can often use various things as input. Commands Commands ha ...
- gstreamer常用命令
由于有好一段时间没做GStreamer相关项目了,早前的一些记录需要做下记录,以待需要的时候查阅. 还是分几个小节来介绍吧,这样思路清晰一点.(格式有点乱,没时间整理,读者自行脑补) 1. 播放视频. ...
- 【LiteOS】Liteos移植篇
目录 前言 链接 参考 笔录草稿 移植(2018) 移植获取 (Cortex-M 内核) 主要文件夹分析 移植过程 1. 拷贝文件 2. 创建工程分组 3. 添加头文件路径 4. 兼容 C99 模式 ...
- XML数据持久化学习笔记
一.XML基础语法 1.XML结构:XML是一种树结构的文本 2.XML注释:格式:<!--在其中书写注释-->,在注释中可以单行注释也可以多行注释 3.固定内容:<?xml ver ...
- 力扣 - 208. 实现Trie(前缀树)
目录 题目 思路 代码 复杂度分析 题目 208. 实现 Trie (前缀树) 思路 在我们生活中很多地方都用到了前缀树:自动补全,模糊匹配,九宫格打字预测等等... 虽然说用哈希表也可以实现:是否出 ...
- 加快Python运行速度
01 使用哈希表的数据结构 如果在程序中遇到大量搜索操作时,并且数据中没有重复项,则可以使用查找而不是循环.举例如下: items = ['a', 'b',..,'100m'] #1000s of i ...
- 『Spring Boot 2.4新特性』减少95%内存占用
节省 95%的内存占用,减少 80%的启动耗时. GraalVM 是一种高性能的虚拟机,它可以显著的提高程序的性能和运行效率,非常适合微服务.最近比较火的 Java 框架 Quarkus 默认支持 G ...
- 关于Maven中<packaging>产生的一些问题
关于Maven中产生的一些问题 一.项目的打包类型 jar 默认的打包格式 war 打包成需要部署的项目 pom 父类型为pom类型 二. pom 简单来说,一个多模块项目通过一个父POM 引用一个或 ...
- JVM学习笔记(三):JVM基本参数
1 来源 来源:<Java虚拟机 JVM故障诊断与性能优化>--葛一鸣 章节:第三章 本文是第三章的一些笔记整理. 2 GC日志:-Xlog:gc 要打印GC日志的话,可以加上-Xlog: ...
- 自定义grub主题
1 概述 自定义grub引导菜单的主题,笔者的linux是deepin,感觉默认的grub主题不太好看,嗯,没办法,就是想改了. 这篇文章主要是修改/boot/grub/grub.cfg以及/boot ...