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 字符串必须是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的更多相关文章

  1. jQuery学习之路(8)- 表单验证插件-Validation

    ▓▓▓▓▓▓ 大致介绍 jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法,包括 ...

  2. jQuery- 表单验证插件-Validation

      ▓▓▓▓▓▓ 大致介绍 jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法, ...

  3. 交叉验证(Cross Validation)原理小结

    交叉验证是在机器学习建立模型和验证模型参数时常用的办法.交叉验证,顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏. ...

  4. MVC学习系列13--验证系列之Remote Validation

    大多数的开发者,可能会遇到这样的情况:当我们在创建用户之前,有必要去检查是否数据库中已经存在相同名字的用户.换句话说就是,我们要确保程序中,只有一个唯一的用户名,不能有重复的.相信大多数人都有不同的解 ...

  5. MVC学习系列12---验证系列之Fluent Validation

    前面两篇文章学习到了,服务端验证,和客户端的验证,但大家有没有发现,这两种验证各自都有弊端,服务器端的验证,验证的逻辑和代码的逻辑混合在一起了,如果代码量很大的话,以后维护扩展起来,就不是很方便.而客 ...

  6. jQuery Validation Engine 表单验证

    功能强大的 jQuery 表单验证插件,适用于日常的 E-mail.电话号码.网址等验证及 Ajax 验证,除自身拥有丰富的验证规则外,还可以添加自定义的验证规则. 兼容 IE 6+, Chrome, ...

  7. 架构验证过程发现非数据类型错误 validation found non-data type errors

    问题: infopath报一下错误 validation found non-data type errors 架构验证过程发现非数据类型错误 原因: 重复表字段在后台代码里要一一对应,否则报错. 错 ...

  8. ORA-19563: header validation failed for file

    在测试服务器还原数据库时遇到了ORA-19563错误.如下所示 RMAN-00571: ======================================================== ...

  9. [WPF系列]-Data Validation

    项目经常前台界面涉及到用户输入时,我们常常会用到数据有效性的验证.在网页中我们之前用js来校验Form中的数据有效性.在WPF中我们如何实现这种验证机制了?答案:INotifyDataErrorInf ...

随机推荐

  1. x64dbg 条件断点相关文档

    输入 字符格式 条件断点 Input When using x64dbg you can often use various things as input. Commands Commands ha ...

  2. gstreamer常用命令

    由于有好一段时间没做GStreamer相关项目了,早前的一些记录需要做下记录,以待需要的时候查阅. 还是分几个小节来介绍吧,这样思路清晰一点.(格式有点乱,没时间整理,读者自行脑补) 1. 播放视频. ...

  3. 【LiteOS】Liteos移植篇

    目录 前言 链接 参考 笔录草稿 移植(2018) 移植获取 (Cortex-M 内核) 主要文件夹分析 移植过程 1. 拷贝文件 2. 创建工程分组 3. 添加头文件路径 4. 兼容 C99 模式 ...

  4. XML数据持久化学习笔记

    一.XML基础语法 1.XML结构:XML是一种树结构的文本 2.XML注释:格式:<!--在其中书写注释-->,在注释中可以单行注释也可以多行注释 3.固定内容:<?xml ver ...

  5. 力扣 - 208. 实现Trie(前缀树)

    目录 题目 思路 代码 复杂度分析 题目 208. 实现 Trie (前缀树) 思路 在我们生活中很多地方都用到了前缀树:自动补全,模糊匹配,九宫格打字预测等等... 虽然说用哈希表也可以实现:是否出 ...

  6. 加快Python运行速度

    01 使用哈希表的数据结构 如果在程序中遇到大量搜索操作时,并且数据中没有重复项,则可以使用查找而不是循环.举例如下: items = ['a', 'b',..,'100m'] #1000s of i ...

  7. 『Spring Boot 2.4新特性』减少95%内存占用

    节省 95%的内存占用,减少 80%的启动耗时. GraalVM 是一种高性能的虚拟机,它可以显著的提高程序的性能和运行效率,非常适合微服务.最近比较火的 Java 框架 Quarkus 默认支持 G ...

  8. 关于Maven中<packaging>产生的一些问题

    关于Maven中产生的一些问题 一.项目的打包类型 jar 默认的打包格式 war 打包成需要部署的项目 pom 父类型为pom类型 二. pom 简单来说,一个多模块项目通过一个父POM 引用一个或 ...

  9. JVM学习笔记(三):JVM基本参数

    1 来源 来源:<Java虚拟机 JVM故障诊断与性能优化>--葛一鸣 章节:第三章 本文是第三章的一些笔记整理. 2 GC日志:-Xlog:gc 要打印GC日志的话,可以加上-Xlog: ...

  10. 自定义grub主题

    1 概述 自定义grub引导菜单的主题,笔者的linux是deepin,感觉默认的grub主题不太好看,嗯,没办法,就是想改了. 这篇文章主要是修改/boot/grub/grub.cfg以及/boot ...