SpringBoot - 后端数据校验的实现

通常来说,为了提高系统运行效率,都会在前端进行数据校验,但后端的数据校验仍然必不可少,因为用户还是可能在获取数据接口后手动传入非法数据,所以后端还是需要做数据校验。
对于数据校验,Spring Boot 也提供了相关的自动化配置解决方案,下面通过样例进行演示。

一、普通校验

1,添加依赖

首先编辑项目的pom.xml 文件,添加数据校验相关的依赖。

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

2,创建校验出错的提示文件
在 resources 目录下创建一个 ValidationMessages.properties 文件(默认的创建校验出错的提示文件),里面内容如下:

注意:如果文件里的中文内容出现乱码,可以参考我之前写的文件来解决:
SpringBoot - 配置文件application.properties使用
user.name.size=用户名长度介于5到10个字符之间
user.address.notnull=用户地址不能为空
user.age.size=年龄输入不正确
user.email.notnull=邮箱不能为空
user.email.pattern=邮箱格式不正确

3,数据校验配置
接下来创建一个 User 类,并配置相关的数据校验:

@NoArgsConstructor
@Setter
@Getter
public class User  {// @Size 注解表示一个字符串的长度或者一个集合的大小,必须在某一个范围中@Size(min = 5, max = 10, message = "{user.name.size}")private String name;// @NotEmpty 注解表示该字段不能为空@NotEmpty(message = "{user.address.notnull}")private String address;// @DecimalMin 注解表示对应属性值的下限@DecimalMin(value = "1", message = "{user.age.size}")// @DecimalMax 注解表示对应属性值的上限@DecimalMax(value = "200", message = "{user.age.size}")private Integer age;// @Email 注解表示对应属性格式是一个 Email@Email(message = "{user.email.pattern}")// @NotNull 注解表示该字段不能为null@NotNull(message = "{user.email.notnull}")private String email;
}

4,Controller 配置
​ 接下来创建一个 Controller,给 User 参数添加 @Validated 注解,表示需要对该参数做校验,后面的 BindingResult 参数表示在校验出错时保存的出错信息。

@RestController
public class HelloController {@PostMapping("/user")public List<String> addUser(@Validated User user, BindingResult result) {List<String> errors = new ArrayList<>();// 如果 BindingResult 的 hasErrors 方法返回true,则表示有错误信息if (result.hasErrors()) {List<ObjectError> allErrors = result.getAllErrors();/// 遍历错误信息,返回给前端for (ObjectError error : allErrors) {errors.add(error.getDefaultMessage());}}return errors;}
}

5,运行测试
(1)启动项目后,我们如果直接访问“/user”接口,则返回如下信息:

(2)如果传入用户地址、一个非法邮件地址以及一个格式不正确的用户名,结果如下:

二、分组校验

​ 有的时候,我们在某一个实体类中定义了很多校验规则,但是在某一次业务处理中,并不需要这么多校验规则,此时就可以使用分组校验。具体步骤如下。

1,创建分组接口

首先创建两个分组接口:

public interface ValidationGroup1 {
}
public interface ValidationGroup2 {
}

2,在实体类中添加分组信息
这次在注解中添加了 groups 属性,表示该校验规则所属的分组:

@NoArgsConstructor
@Setter
@Getter
public class User  {// @Size 注解表示一个字符串的长度或者一个集合的大小,必须在某一个范围中@Size(min = 5, max = 10, message = "{user.name.size}", groups = ValidationGroup1.class)private String name;// @NotEmpty 注解表示该字段不能为空@NotEmpty(message = "{user.address.notnull}", groups = ValidationGroup2.class)private String address;// @DecimalMin 注解表示对应属性值的下限@DecimalMin(value = "1", message = "{user.age.size}")// @DecimalMax 注解表示对应属性值的上限@DecimalMax(value = "200", message = "{user.age.size}")private Integer age;// @Email 注解表示对应属性格式是一个 Email@Email(message = "{user.email.pattern}")// @NotNull 注解表示该字段不能为null@NotNull(message = "{user.email.notnull}", groups = ValidationGroup2.class)private String email;
}

3,在 Controller 中指定校验分组
​ 接下来在 @Validated 注解中指定校验分组,这里的 @Validated(ValidationGroup2.class) 表示这里的校验使用 ValidationGroup2 分组的校验规则(只校验用户地址、邮箱地址是否为空):

@RestController
public class HelloController {@PostMapping("/user")public List<String> addUser(@Validated(ValidationGroup2.class) User user,BindingResult result) {List<String> errors = new ArrayList<>();// 如果 BindingResult 的 hasErrors 方法返回true,则表示有错误信息if (result.hasErrors()) {List<ObjectError> allErrors = result.getAllErrors();/// 遍历错误信息,返回给前端for (ObjectError error : allErrors) {errors.add(error.getDefaultMessage());}}return errors;}
}

4,运行测试

启动项目,再次发起请求进行测试,可以看到这次只校验邮箱地址是否为空,用户地址是否为空:

附:校验注解汇总

上面的样例只是演示了几个常见的校验注解,实际上校验注解远不止这几个,下面是完整的校验注解参考表。

验证注解 验证的数据类型 说明
空检查
@Null 任意类型 验证注解的元素值是 null
@NotNull 任意类型 验证注解的元素不是 null
@NotBlank CharSequence 子类型(CharBuffer、String、StringBuffer、StringBuilder) 验证注解的元素值不为空(不为 null、去除首尾空格后长度不为 0),不同于 @NotEmpty,@NotBlank 只应用于字符串且在比较时会去除字符串的首尾空格
@NotEmpty CharSequence 子类型、Collection、Map、数组 验证注解的元素值不为 null 且不为空(字符串长度不为 0、集合大小不为 0)
Boolean检查
@AssertFalse Boolean,boolean 验证注解的元素值是 false
@AssertTrue Boolean,boolean 验证注解的元素值是 true
长度检查
@Size(min=下限, max=上限) 字符串、Collection、Map、数组等 验证注解的元素值的在 min 和 max(包含)指定区间之内,如字符长度、集合大小
@Length(min=下限, max=上限) CharSequence 子类型 验证注解的元素值长度在 min 和 max 区间内
日期检查
@Past java.util.Date,java.util.Calendar,Joda-Time 类库的日期类型 验证注解的元素值(日期类型)比当前时间早
@Future 与 @Past 要求一样 验证注解的元素值(日期类型)比当前时间晚
@PastOrPresent 与 @Past 要求一样 验证注解的元素值(日期类型)比当前时间早,或者是当前时间
@FutureOrPresent 与 @Past 要求一样 验证注解的元素值(日期类型)比当前时间晚,或者是当前时间
数值检查
@MIN(value=值) BigDecimal,BigInteger, byte,short, int, long,等任何 Number 或 CharSequence(存储的是数字)子类型 验证注解的元素值大于等于 @Min 指定的 value 值
@MAX(value=值) 和 @Min 要求一样 验证注解的元素值小于等于 @Max 指定的 value 值
@DecimalMin(value=值) 和 @Min 要求一样 验证注解的元素值大于等于 @ DecimalMin 指定的 value 值
@DecimalMax(value=值) 和 @Min 要求一样 验证注解的元素值小于等于 @ DecimalMax 指定的 value 值
@Digits(integer=整数位数, fraction=小数位数) 和 @Min 要求一样 验证注解的元素值的整数位数和小数位数上限
@Range(min=最小值, max=最大值) BigDecimal,BigInteger,CharSequence,byte,short,int,long等原子类型和包装类型 验证注解的元素值在最小值和最大值之间
@Negative 和 @Range 要求一样 验证注解的元素必须是负数
@NegativeOrZero 和 @Range 要求一样 验证注解的元素必须是负数或 0
@Positive 和 @Range 要求一样 验证注解的元素必须是正数
@PositiveOrZero 和 @Range 要求一样 验证注解的元素必须是正数或 0
其他检查
@Valid 任何非原子类型 指定递归验证关联的对象;如用户对象中有个地址对象属性,如果想在验证用户对象时一起验证地址对象的话,在地址对象上加 @Valid 注解即可级联验证
@Pattern(regexp=正则表达式,flag=标志的模式) CharSequence 的子类型 验证注解的元素值与指定的正则表达式匹配
@Email(regexp=正则表达式,flag=标志的模式) CharSequence 的子类型 验证注解的元素值是 Email,也可以通过 regexp 和 flag 指定自定义的 email 格式
@CreditCardNumber CharSequence 的子类型 验证注解元素值是信用卡卡号
@ScriptAssert(lang= ,script=) 业务类 校验复杂的业务逻辑

SpringBoot - 后端数据校验的实现相关推荐

  1. SpringBoot后端数据校验实战

    本文从本人博客搬运,原文格式更加美观,可以移步原文阅读:SpringBoot后端数据校验实战 一般我们会在Controller的接口中对前端传递的参数做数据校验,这是一个后端开发人员的基本素养 在Sp ...

  2. springboot后端数据校验以及异常处理

    文章目录 常用校验工具包 1.package javax.validation.constraints 包 2.package org.hibernate.validator.constraints; ...

  3. 实现Java后端数据校验

    每次我们在搭建一个开源项目的首要任务包括:项目的统一异常处理.统一结果封装以及做项目的数据校验,在前后端分离的情况下,不仅前端需要做数据校验,同样后端也要实现,前端主要使用一些类似与jQuery Va ...

  4. 后端数据校验之JSR303

    后端数据校验之JSR303 JSR303的使用 分组校验 自定义校验规则 一般在项目开发中,对数据准确性的校验必不可少,除了前端对数据进行校验,后端也要对数据进行校验. JSR303的使用 JSR30 ...

  5. SpringBoot中后端数据校验

    文章目录 1.为什么后端要进行数据校验? 2.怎么使用数据校验?(要添加对应依赖) 实现对手机号码的数据校验: 入参对象包含集合时,怎么对集合中的每个属性进行校验 1.为什么后端要进行数据校验? 如果 ...

  6. java 后端校验_如何实现Java后端数据校验?看这篇就足够!

    前言 每次我们在搭建一个开源项目的首要任务包括:项目的统一异常处理.统一结果封装以及做项目的数据校验,在前后端分离的情况下,不仅前端需要做数据校验,同样后端也要实现,前端主要使用一些类似与jQuery ...

  7. springboot之数据校验及多环境切换

    数据校验及多环境切换 Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理.我们这里来写个注解让我们的age不能超过22: 首先导入依赖 &l ...

  8. springboot validated注解数据校验 异常处理

    springboot validated 数据校验 validated 数据校验 简单的写一下这个用法啊,清晰的本篇文章就记录这个注解的一个用法. validated 数据校验 我们一般的数据校验是怎 ...

  9. 如何优雅的处理异常?SpringBoot全局异常与数据校验

    要思考的问题 在现在的前后端交互中,通常都规范了接口返回方式,如返回的接口状态(成功|失败)以及要返回的数据在那个字段取,或者说失败了以后提示信息从接口哪里返回,因此,如果想做全局异常,并且异常发生后 ...

最新文章

  1. 百所学校寒假时长排行,看看你的学校排多少名~
  2. 3D姿态估计|时序卷积+半监督训练
  3. 团队冲刺(二)个人工作总结9
  4. 最全Windows下搭建go语言开发环境以及开发IDE
  5. 1859. 将句子排序
  6. CSS3动画 - 心脏跳动
  7. HDOJ 1021-1025
  8. 洛谷P2879 [USACO07JAN]区间统计Tallest Cow
  9. udpSocket捕获ICMP不可达错误
  10. Mininet-wifi安装和简单使用
  11. dom解析,解析xml文件
  12. 思维导图 · B端业务的难点
  13. windows在此计算机上找不到系统映象,win7系统在恢复系统印象时找不到映像文件 – 手机爱问...
  14. 【IPD】IPDPLM
  15. Windows系统精华
  16. 《如何有效阅读一本书:超实用笔记读书法》读书笔记
  17. Like后面跟子查询
  18. 如何使用Movie Studio制作幻灯片?
  19. android http收取文件夹,安卓Android手机系统内文件夹目录解释
  20. android 缩小消失动画,Android本身View的拉长缩短动画

热门文章

  1. 鸿蒙三方组件资源汇总
  2. 话题 | 研究生期间专心搞科研 or 兼职?
  3. 朴素系统优化思维的实践
  4. Notes on Matplotlib
  5. 如何取消a标签超级链接跳转的问题
  6. linux导入mysql数据库_linux下导入、导出mysql数据库命令
  7. 从Borland C++了解的
  8. 寻找树中两个结点的最低公共祖先
  9. 更新163邮箱自动登陆已经自动发送邮箱
  10. 在windows cmd中制作图片一句话