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. 【JVM进阶之路】七:垃圾收集器盘点

    在前面,我们已经了解了JVM的分代收集,知道JVM垃圾收集在新生代主要采用标记-复制算法,在老年代主要采用标记-清除和标记-整理算法.接下来,我们看一看JDK默认虚拟机HotSpot的一些垃圾收集器的 ...

  2. List集合中的交集 并集和差集

    目录 List集合求交集 并集 差集 Set集合 Lambda表达式 List集合求交集 并集 差集 两种方法求集 Set集合 交集 两个集合中有相同的元素 抽取出来的数据就是为交集 @Test pu ...

  3. (十三)struts2的输入校验

    输入校验是web应用必须处理的问题,要防止用户的误输入和恶意非法输入.struts2给我们提供了非常强大的输入校验体系. 输入校验分为客户端校验和服务器端校验.一般开发中两者都用,但是服务端校验必须使 ...

  4. TCP的client和server的简单连接

    server: import socket as s import threading as t bind_ip = "0.0.0.0" bind_port = 80#配置服务器监 ...

  5. Leedcode算法专题训练(哈希表)

    Java 中的 HashSet 用于存储一个集合,可以查找元素是否在集合中.如果元素有穷,并且范围不大,那么可以用一个布尔数组来存储一个元素是否存在.例如对于只有小写字符的元素,就可以用一个长度为 2 ...

  6. Python 高级进阶知识(一)

    参考 Python学习手册 第四版 1 from vs import import 模块 : 导入的一整个模块(python中模块对应一个py文件) 因为import使用一个变量名引用整个模块对象,所 ...

  7. 2020.1 IDEA 激活

    1 下载安装 平台windows,官网这里. 选位置之后: 选项分别是创建32/64位的快捷方式,把运行目录添加到PATH环境变量,添加右键菜单"打开文件夹作为工程",添加java ...

  8. Day06_32_Java各种内部类

    内部类 内部类都有哪些? 成员内部类 匿名内部类 静态内部类 局部内部类 成员内部类 - 成员内部类内部不能有静态声明(静态方法和静态变量) - 成员内部类可以访问外部类中所有的数据包括静态数据和实例 ...

  9. FusionInsight MRS:你的大数据“管家”

    摘要:4月24日-26日,HDC.Cloud2021在深圳大学城成功举办,华为云FusionInsight MRS云原生数据湖带来最懂行的大数据解决方案,为政企客户提供湖仓一体.云原生的大数据解决方案 ...

  10. 数据结构(1):稀疏数组使用java实现

    主要是用于数组压缩,去除无效的数组内容: 原数组内容: 0 0 0 0 0 0 1 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 转换成 稀疏数组 5 5 2 1 1 1 2 ...