使用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 |
| 被注释的元素必须是电子邮箱地址 | |
| @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
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
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