0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

简述Spring Boot数据校验

jf_78858299 来源:QStack 作者:月下西楼 2023-03-17 15:07 次阅读

上一篇文章我们了解了Spring Boot Web相关的知识,初步了解了spring-boot-starter-web,还了解了@Contrler和@RestController的差别,如果使用@Controller注解只返回数据则需要使用@ResponseBody注解。与此同时还了解了@RequestMapping注解与URL映射,URL映射可以分为URL路径匹配、Method匹配、consumes和produces匹配、params和header匹配。这篇文章我们将会介绍数据校验,对于任何应用系统而言,任何客户端传入的数据都不是绝对安全有效的,这就要求我们在服务端接收到数据时需要对传入的数据的有效性进行验证,以确保传入的数据安全正确。

Hibernate Validator简介

目前数据校验的规范和组件有很多,Spring Boot默认使用的数据校验组件是基于JSR数据校验规范的Hibernate Validator,其中常用的注解如下表所示

注解 作用目标 检查规则
@NotNull 属性 检查值是否为空
@Null 属性 检查值必须为空
@AsserFalse 属性 检查演算结果是否为false
@AssertTrue 属性 检查演算结果是否为true
@Max(value=) 属性(以numeric或string类型表示一个数字) 检查值是否小于或等于最大值
@Min(value=) 属性(以numeric或string类型表示一个数字) 检查值是否大于或等于最小值
@Size(min=, max=) 属性(array,collection,map) 检查元素大小是否在最大值和最小值之间(包括临界值)
@Digits(integer,fraction) 属性 检查元素必须是数字且在范围内
@Past 属性(data或calender) 检查日期是否是过去的日期
@Feature 属性data或calender) 检查日期是否是未来的日期
@Pattern(regex="rexgex",flag=) 属性 检查值是否与正则表达式匹配
@Range(min=,max=) 属性(以numeric或string类型表示一个数字) 检查元素大小是否在最大值和最小值之间(包括临界值)
@Length(min=,max=) 属性(String) 检查字符串长度是否符合范围
@Email 属性(String) 检查是否是有效的Email地址
@NotEmpty 属性(String) 检查字符串不能为空

使用Hibernate Validator校验数据需要定义一个接受的数据模型,使用注解的形式描述字段的校验规则,下面以User对象为例说明如何校验数据,先加入以下依赖:

<dependency>
    <groupId>org.springframework.boot<span class="hljs-name"groupId>
    <artifactId>spring-boot-starter-validation<span class="hljs-name"artifactId>
<span class="hljs-name"dependency>

JavaBean参数校验

Post请求参数较多时可以在对应的数据模型(Java Bean)中进行校验,通过注解来指定字段校验的规则。

public class User {

    @NotBlank(message = "姓名不允许为空")
    @Length(min = 2, max = 10, message = "姓名长度错误,姓名长度2-10")
    private String Name;
    
    @NotNull(message = "年龄不能为空!")
    @Min(18)
    private int age;
    
    @NotBlank(message = "地址不能为空!")
    private String address;
    
    @Email(message = "邮箱格式错误")
    private String email;
    
    //省略get和set方法
}

上述例子中,每个message是数据校验不通过时要给出的提示信息。然后需要添加数据校验方法。

@PostMapping(path = "/check")
public String check(@RequestBody @Valid User user, BindingResult result) {
    String name = user.getName();
    if (result.hasErrors()) {
        List

上面例子中BindingResult是验证不通过的结果集合,必须跟在被校验参数后,若被校验参数之后没有BindingResult则会抛出BindException异常。

JavaBean对象的级联校验

在对象的普通属性上我们可以直接使用注解进行数据校验,对于关联对象也很容易,在关联对象上添加@Valid注解,关联对象内部可以正常使用数据校验注解。代码如下:

public class User {

    @NotBlank(message = "姓名不允许为空")
    @Length(min = 2, max = 10, message = "姓名长度错误,姓名长度2-10")
    private String Name;

    @NotNull(message = "年龄不能为空!")
    @Min(18)
    private int age;

    @NotBlank(message = "地址不能为空!")
    private String address;

    @Email(message = "邮箱格式错误")
    private String email;

    @NotNull(message = "detail不能为空")
    @Valid
    private UserDetail detail;
    //省略get和set方法
}
public class UserDetail {

    @NotNull(message = "id不能为空")
    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
}

分组校验

在不同的情况下,可能对相同javaBean对象的数据校验规则有所不同,有时需要根据状态数据对javaBean中的某些属性字段进行单独验证。这时候就可以使用分组校验功能,即根据状态启用一组约束,Hibernate Validator的注解提供了groups参数用于指定分组,如果没有指定groups参数,则默认属于javax.validation.groups.Default。接下来我们举例来说明这一过程。

首先创建分组GroupA和GroupB如下,这两个接口作为两个校验规则的分组。

public interface GroupA {
}
public interface GroupB {
}

然后创建实体类Person,并在相关字段定义分组校验规则。

public class Person {

    @NotBlank(message = "userId不能为空", groups = {GroupA.class})
    private String userId;

    @NotBlank(message = "用户名不能为空", groups = {GroupB.class})
    private String name;

    @Range(min=20, max = 30, message = "年龄必须在【20,30】", groups = {GroupA.class})
    @Range(min = 30, max = 40, message = "年龄必须在【30,40】", groups = {GroupB.class})
    private int age;

   //省略来get方法和set方法
}

上述例子中,在age字段使用了两个校验规则,GroupA年龄要在20-30,GroupB年龄要在30-40。最后使用分组:

@RequestMapping("/save")
public String save(@RequestBody @Validated({ GroupA.class, Default.class}) Person person, BindingResult result) {
    if (result.hasErrors()) {
        List

其中@Validated注解中增加了{GroupA.class, Default.class}参数表示对于定义了分组校验规则的字段使用GroupA规则,其他使用默认规则。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Web
    Web
    +关注

    关注

    2

    文章

    1263

    浏览量

    69449
  • URL
    URL
    +关注

    关注

    0

    文章

    139

    浏览量

    15329
  • spring
    +关注

    关注

    0

    文章

    340

    浏览量

    14340
  • 服务端
    +关注

    关注

    0

    文章

    66

    浏览量

    7006
收藏 人收藏

    评论

    相关推荐

    Spring Boot如何实现异步任务

    Spring Boot 提供了多种方式来实现异步任务,这里介绍三种主要实现方式。 1、基于注解 @Async @Async 注解是 Spring 提供的一种轻量级异步方法实现方式,它可以标记在方法上
    的头像 发表于 09-30 10:32 1436次阅读

    Spring Boot Starter需要些什么

    pulsar-spring-boot-starter是非常有必要的,在此之前,我们先看看一个starter需要些什么。 Spring Boot Starter spring-boot
    的头像 发表于 09-25 11:35 759次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> Starter需要些什么

    启动Spring Boot项目应用的三种方法

    微服务!据谷歌搜索调查数据显示,spring boot将成为新一代框架。所以从事javaee开发的小伙伴,学好spring boot是非常有
    发表于 01-14 17:33

    Spring Boot从零入门1 详述

    在开始学习Spring Boot之前,我之前从未接触过Spring相关的项目,Java基础还是几年前自学的,现在估计也忘得差不多了吧,写Spring
    的头像 发表于 12-10 22:18 633次阅读

    Spring Boot实现各种参数校验

    之前也写过一篇关于Spring Validation使用的文章,不过自我感觉还是浮于表面,本次打算彻底搞懂Spring Validation。本文会详细介绍Spring Validation各种场景下的最佳实践及其实现原理,死磕
    的头像 发表于 08-14 15:54 959次阅读

    Spring Boot特有的实践

    Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这些内容是基于我的个人经验
    的头像 发表于 09-29 10:24 905次阅读

    强大的Spring Boot 3.0要来了

    来源:OSC开源社区(ID:oschina2013) Spring Boot 3.0 首个 RC 已发布,此外还为两个分支发布了更新:2.7.5 2.6.13。 3.0.0-RC1: https
    的头像 发表于 10-31 11:17 1863次阅读

    Spring Boot Web相关的基础知识

    Boot的第一个接口。接下来将会将会介绍使用Spring Boot开发Web应用的相关内容,其主要包括使用spring-boot-starter-web组件来实现Web应用开发、UR
    的头像 发表于 03-17 15:03 654次阅读

    Spring Boot应用中如何做好参数校验

    参数验证很重要,是平时开发环节中不可少的一部分,但是我想很多后端同事会偷懒,干脆不错,这样很可能给系统的稳定性和安全性带来严重的危害。那么在Spring Boot应用中如何做好参数校验工作呢,本文提供了10个小技巧,你知道几个呢
    的头像 发表于 05-11 10:52 752次阅读

    Spring Boot应用中如何做好参数校验?2

    参数验证很重要,是平时开发环节中不可少的一部分,但是我想很多后端同事会偷懒,干脆不错,这样很可能给系统的稳定性和安全性带来严重的危害。那么在Spring Boot应用中如何做好参数校验工作呢,本文提供了10个小技巧,你知道几个呢
    的头像 发表于 05-11 10:56 505次阅读

    Spring Boot如何优雅实现数据加密存储、模糊匹配和脱敏

    近来我们都在围绕着使用Spring Boot开发业务系统时如何保证数据安全性这个主题展开总结,当下大部分的B/S架构的系统也都是基于Spring B
    的头像 发表于 06-19 14:42 1953次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>如何优雅实现<b class='flag-5'>数据</b>加密存储、模糊匹配和脱敏

    Spring Boot Actuator快速入门

    不知道大家在写 Spring Boot 项目的过程中,使用过 Spring Boot Actuator 吗?知道 Spring
    的头像 发表于 10-09 17:11 636次阅读

    Spring Boot启动 Eureka流程

    在上篇中已经说过了 Eureka-Server 本质上是一个 web 应用的项目,今天就来看看 Spring Boot 是怎么启动 Eureka 的。 Spring Boot 启动 E
    的头像 发表于 10-10 11:40 893次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>启动 Eureka流程

    Spring Boot的启动原理

    可能很多初学者会比较困惑,Spring Boot 是如何做到将应用代码和所有的依赖打包成一个独立的 Jar 包,因为传统的 Java 项目打包成 Jar 包之后,需要通过 -classpath 属性
    的头像 发表于 10-13 11:44 646次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>的启动原理

    Spring Boot 的设计目标

    什么是Spring Boot Spring BootSpring 开源组织下的一个子项目,也是 S
    的头像 发表于 10-13 14:56 582次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 的设计目标