在开发现代应用程序时,数据验证是确保用户输入的正确性和应用程序数据完整性的关键方面。Spring Boot 提供了强大的数据验证机制,使开发者能够轻松地执行验证操作。本文将深入介绍 Spring Boot 中的 Validation,以及如何在应用程序中正确使用它。
为什么使用数据验证?
数据验证是确保用户输入的正确性的一种重要手段。通过验证用户输入的数据,可以防止无效或错误的数据进入应用程序,提高数据的质量。例如:系统中的备注字段数据库中对应的长度是256,如果用户输入的备注超过这个长度值,那么就会导致mysql报Data too long。
数据完整性是指数据在存储和传输过程中的准确性和一致性。数据验证有助于确保数据满足特定的格式、长度、范围等要求,从而提高数据的完整性。
数据验证也是保障应用程序安全性的关键因素。通过验证用户输入,可以防范一些潜在的安全威胁,例如 SQL 注入、跨站脚本攻击等。
在应用程序中,通常存在一些业务规则,例如某个字段不能为空、日期范围必须在某个特定范围内等。通过数据验证,可以确保这些业务规则在应用程序中得到正确执行。
因Springboot的spring-boot-starter-web默认内置了Hibernate-Validator(Spring boot 2.3以前版本),虽然Hibernate-Validator也能做到数据校验,但是考虑到spring-boot-starter-validation 是一个抽象层,使得验证框架的具体实现变得可插拔。这意味着,除了 Hibernate Validator,开发者可以选择其他符合 Bean Validation 规范的实现。所以我们可以手动引入spring-boot-starter-validation实现数据验证。
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
基本用法
Spring Boot Validation 提供了一系列注解,用于在实体类中定义验证规则。以下是一些常用的校验相关的注解及其功能以及用法:
1.@NotNull: 校验元素值不能为 null。如果元素为null,则验证失败。通常用于字段级别的验证。
@NotNull(message = "Name cannot be null")
private String name;
2.@NotBlank: 校验字符串元素值不能为 null 或空字符串。必须包含至少一个非空格字符(即执行trim()之后不为’')。如果元素为null或者‘‘,则验证失败。通常用于String类型的字段校验。
@NotBlank(message = "Username cannot be blank")
private String username;
3.NotEmpty: 校验集合元素或数组元素或者字符串是否非空。通常作用于集合字段或数组字段,此时需要集合或者数字的元素个数大于0。也可以作用于字符串,此时校验字符串不能为null或空串(可以是一个空格)。注意与@NotBlank的使用区别。
@NotEmpty(message = "List cannot be empty")
private List<String> items;
4.@Length: 校验字符串元素的长度。作用于字符串。注:Hibernate-Validator中注解,等同于spring-boot-starter-validation中的@Size。
@Length(min = 5, max = 20, message = "Length must be between 5 and 20 characters")
private String username;
5.@Size: 校验集合元素个数或字符串的长度在指定范围内。在集合或字符串字段上添加 @Size 注解。
@Size(min = 1, max = 10, message = "Number of items must be between 1 and 10")
private List<String> items;
@Size(min = 5, max = 20, message = "Length must be between 5 and 20 characters")
private String username;
6.@Min: 校验数字元素的最小值。
@Min(value = 18, message = "Age must be at least 18")
private int age;
7.@Max: 校验数字元素的最大值。
@Max(value = 100, message = "Age must not exceed 100")
private int age;
8.@DecimalMax: 作用于BigDecimal类型字段, 校验字段的最大值,支持比较的值为字符串表示的十进制数。通常搭配它的inclusive()使用,区别边界问题。value 属性表示最大值,inclusive 属性表示是否包含最大值。
@DecimalMax(value = "100.00", inclusive = true, message = "Value must be less than or equal to 100.00")
private BigDecimal amount;
9.@DecimalMin: 作用于BigDecimal类型字段, 校验字段的最小值,支持比较的值为字符串表示的十进制数。通常搭配它的inclusive()使用,区别边界问题。value 属性表示最小值,inclusive 属性表示是否包含最小值。
@DecimalMin(value = "0.00", inclusive = false, message = "Value must be greater than 0.00")
private BigDecimal amount;
10.@Email: 校验字符串元素是否为有效的电子邮件地址。可以通过regexp自定义邮箱匹配正则。
@Email(message = "Invalid email address")
private String email;
11.@Pattern: 根据正则表达式校验字符串元素的格式。
@Pattern(regexp = "[a-zA-Z0-9]+", message = "Only alphanumeric characters are allowed")
private String username;
12.@Digits: 校验数字元素的整数部分和小数部分的位数。作用于BigDecimal,BigInteger,字符串,以及byte, short,int, long以及它们的包装类型。
@Digits(integer = 5, fraction = 2, message = "Number must have up to 5 integer digits and 2 fraction digits")
private BigDecimal amount;
13.@Past: 校验日期或时间元素是否在当前时间之前。即是否是过去时间。作用于Date相关类型的字段。
@Past(message = "Date must be in the past")
private LocalDate startDate;
14.@Future: 校验日期或时间元素是否在当前时间之后。即是否是未来时间。作用于Date相关类型的字段。
@Future(message = "Date must be in the future")
private LocalDate endDate;