使用Spring Validation完成数据校验

数据的校验是交互式网站一个不可或缺的功能,前端的js校验可以涵盖大部分的校验职责,如用户名唯一性,生日格式,邮箱格式校验等等常用的校验。但是为了避免用户绕过浏览器,使用http工具直接向后端请求一些违法数据,服务端的数据校验也是必要的,可以防止脏数据落到数据库中,如果数据库中出现一个非法的邮箱格式,也会让运维人员头疼不已。本文将要介绍使用validation来对数据进行校验。

# Hibernate Validation与Spring Validation

JSR303是一项标准,JSR|349是其的升级版本,添加了一些新特性,他们规定一些校验规范即校验注解,如**@Null**,@NotNull@Pattern,位于javax.validation.constraints包下,只提供规范不提供实现。

  • Hibernate Validation是对这个规范的实现,它提供了相应的实现,并增加了一些其他校验注解,如**@Email**,@Length@Range等等,他们位于org.hibernate.validator.constraints包下。
  • Spring Validation是Spring为了给开发者提供便捷对Hibernate Validation进行了二次封装。显示校验validated bean时,可以使用spring validation或者hibernate validation,而spring validation另一个特性,便是其在springmvc模块中添加了自动校验,并将校验信息封装进了特定的类中。这无疑便捷了我们的web开发。本文主要介绍在springmvc中自动校验的机制。

# 常用注解

在真正使用之前,我们需要大致了解校验框架所提供的常用注解。

# JSR提供的校验注解

注解 作用
@Null 被注释的元素必须为 null
@NotNull 被注释的元素必须不为 null
@AssertTrue 被注释的元素必须为 true
@AssertFalse 被注释的元素必须为 false
@Min(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@Max(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@DecimalMin(value) 被注释的元素必须是一个数字,其值必须大于等于指定的最小值
@DecimalMax(value) 被注释的元素必须是一个数字,其值必须小于等于指定的最大值
@Size(max=, min=) 被注释的元素的大小必须在指定的范围内
@Digits (integer, fraction) 被注释的元素必须是一个数字,其值必须在可接受的范围内
@Past 被注释的元素必须是一个过去的日期
@Future 被注释的元素必须是一个将来的日期
@Pattern(regex=,flag=) 被注释的元素必须符合指定的正则表达式

# Hibernate Validator提供的校验注解

注解 作用
@NotBlank(message =) 验证字符串非null,且长度必须大于0
@Email 被注释的元素必须是电子邮箱地址
@Length(min=,max=) 被注释的字符串的大小必须在指定的范围内
@NotEmpty 被注释的字符串的必须非空
@Range(min=,max=,message=) 被注释的元素必须在合适的范围内

# 实战

# 引入依赖

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

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>
1
2
3
4
5
6
7
8
9

注意:Spring Boot 2.3之后Hibernate Validator从spring-boot-starter-web中移除,需要添加spring-boot-starter-validation

# 创建实体类

public class User {
    @NotBlank
    private String username;

    @NotBlank
    private String password;

    @Min(value = 0,message = "Age must be greater than zero!")
    private Integer age;

    @Pattern(regexp = "^1([34578])\\d{9}$",message = "Wrong format of phone number.")
    @NotBlank
    private String phone;
    
    @Email
    private String email;
    
    //省略 getter and setter
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 在Controller中校验数据

springmvc为我们提供了自动封装表单参数的功能,一个添加了参数校验的典型controller如下所示。


1
上次更新: 2020/09/17, 11:09:00
最近更新
01
RabbitMQ简介
10-27
02
聊聊Java多态
10-21
03
JVM垃圾回收器
10-16
更多文章>