spring-boot-starter-validation常用注解
一、使用
要使用这些注解,首先确保在你的 Spring Boot 应用的 pom.xml
文件中添加了 spring-boot-starter-validation
依赖。然后,你可以将这些注解应用于你的模型类字段上。在你的控制器方法中,你可以使用 @Valid
或 @Validated
注解来触发验证,例如:
1 | @PostMapping("/users") |
在这个例子中,如果 User
对象的字段不满足注解定义的验证规则,Spring 将抛出一个异常,你可以通过全局异常处理或控制器层的异常处理来处理这些异常,并向用户返回适当的响应。
二、常用注解
spring-boot-starter-validation
依赖包引入了 Java Bean Validation API(通常基于 Hibernate Validator 实现),提供了一系列注解来帮助你对 Java 对象进行验证。以下是一些常用的验证注解及其含义和使用方式:
@NotNull : 确保字段不是
null
。language-java 1
2
3
4
5
6public class User {
@NotNull(message = "用户名不能为空")
private String username;
// 其他字段和方法
}@NotEmpty : 确保字段既不是
null
也不是空(对于字符串意味着长度大于0,对于集合意味着至少包含一个元素)。language-java 1
2
3
4
5
6public class User {
@NotEmpty(message = "密码不能为空")
private String password;
// 其他字段和方法
}@NotBlank : 确保字符串字段不是
null
且至少包含一个非空白字符。language-java 1
2
3
4
5
6public class User {
@NotBlank(message = "邮箱不能为空且不能只包含空格")
private String email;
// 其他字段和方法
}@Size: 确保字段(字符串、集合、数组)符合指定的大小范围。
language-java 1
2
3
4
5
6public class User {
@Size(min = 2, max = 30, message = "用户名长度必须在2到30之间")
private String username;
// 其他字段和方法
}@Min 和 @Max: 对数值类型字段设置最小值和最大值。
language-java 1
2
3
4
5
6
7public class User {
@Min(value = 18, message = "年龄必须大于等于18")
@Max(value = 100, message = "年龄必须小于等于100")
private int age;
// 其他字段和方法
}@Email: 确保字段是有效的电子邮件地址。
language-java 1
2
3
4
5
6public class User {
@Email(message = "无效的邮箱格式")
private String email;
// 其他字段和方法
}@Pattern: 确保字符串字段匹配正则表达式。
language-java 1
2
3
4
5
6public class User {
@Pattern(regexp = "^[a-zA-Z0-9]+$", message = "用户名只能包含字母和数字")
private String username;
// 其他字段和方法
}@Positive 和 @PositiveOrZero: 确保数值字段是正数或者正数和零。
language-java 1
2
3
4
5
6public class Product {
@Positive(message = "价格必须是正数")
private BigDecimal price;
// 其他字段和方法
}
三、@Valid or @Validated ?
@Valid
和 @Validated
注解都用于数据验证,但它们在使用和功能上有一些差异:
@Valid:
- 来源于 JSR 303/JSR 380 Bean Validation API。
- 可以用在方法参数上,以触发对传递给该方法的对象的验证。这通常在 Spring MVC 中用于验证带有
@RequestBody
或@ModelAttribute
注解的参数。 - 不支持验证组的概念,这意味着不能控制验证的顺序或验证特定的子集。
示例:
language-java 1
2
3
4
5@PostMapping("/users")
public ResponseEntity<?> createUser(@Valid @RequestBody User user) {
// 业务逻辑
}@Validated(推荐):
- 是 Spring 的特有注解,不是 JSR 303/JSR 380 的一部分。
- 支持验证组,允许您更灵活地指定在特定情况下应用哪些验证约束。例如,可以根据不同的操作(如创建、更新)定义不同的验证规则。
- 可以用在类型级别(在类上)和方法参数上。在类型级别使用时,它会触发该类中所有带有验证注解的方法的验证。
示例:
language-java 1
2
3
4
5@PostMapping("/users")
public ResponseEntity<?> createUser(@Validated @RequestBody User user) {
// 业务逻辑
}
在实际使用中,如果你需要简单的验证功能,@Valid
是一个很好的选择。如果你需要更复杂的验证逻辑,比如验证组,那么 @Validated
更适合。此外,@Validated
可以应用在类级别,从而对一个类的多个方法进行验证,这在使用 Spring 服务层时非常有用。
四、分组校验
分组校验(Group Validation)是一种在 Java Bean Validation 中用于在不同上下文中应用不同验证规则的方法。这对于那些在不同情况下(例如,创建 vs 更新)需要不同验证规则的对象特别有用。
1. 分组校验的基本概念
在分组校验中,你可以定义多个接口(通常为空)来表示不同的验证组。然后,你可以在验证注解中指定这些接口,以表明该注解仅在验证特定组时应用。
例如,你可能有一个User
类,其中某些字段在创建用户时是必需的,但在更新用户时可能是可选的。
2. 定义验证组
首先,定义两个空接口作为验证组:
1 | public interface OnCreate { |
3. 应用分组到模型
然后,在你的模型类中使用这些接口作为验证注解的参数:
1 | public class User { |
在这个例子中,id
字段仅在创建用户时需要验证(OnCreate
组),而 username
和 email
字段在创建和更新用户时都需要验证。
4. 在控制器中使用分组
最后,在你的控制器方法中,使用 @Validated
注解指定要应用的验证组:
1 | @PostMapping("/users") |
在这个例子中,createUser
方法只会验证属于 OnCreate
组的字段,而 updateUser
方法则只会验证属于 OnUpdate
组的字段。这样,你就可以根据不同的操作自定义验证逻辑了。
5. 默认组如何总是被校验
当字段没有指定groups
时,属于默认组,当@Validated(OnUpdate.class)
指定了特定的组后,属于默认组的字段将不再被校验,一个个都加上groups
太麻烦,如何让默认组字段总是被校验呢?
如下
1 | import jakarta.validation.groups.Default; |
6. 总结
通过使用分组校验,你可以为同一个对象的不同操作设置不同的验证规则,这在复杂应用中非常有用。这种方法提高了代码的灵活性和可维护性。
spring-boot-starter-validation常用注解
https://xiamu-ssr.github.io/Hexo/2024/01/27/2024-H1/2024-01-27-16-26-19/