目的
参数校验可以增强程序的健壮性。
实现方案
主要实现方法:
- 手动校验(缺点:麻烦)
- 使用注解校验(主流)
在Java中,注解校验有相关规范名为Bean Validation。
Hibernate Validator是Bean Validation的一个实现,它不仅实现了Bean Validation规范中的所有功能,还进行了一些扩展。
而Spring Validation 起到了一个让Hibernate Validator更好的集成到Spring中的作用。
Bean Validation
Bean Validation是一个规范。描述规范可以是语言,也可以是代码。
Bean Validation使用注解描述了数据校验的规范。
Bean Validation定义的注解
注解 | 描述 |
---|---|
@NotNull | 检查属性值不能为null |
@NotEmpty | 检查字符串、集合或数组等属性不能为空(即不是null且长度大于0) |
@NotBlank | 检查字符串属性不能仅包含空白字符(即不是null,且去除首尾空白后长度大于0),仅适用于String |
@Min(value) | 检查数值属性是否大于或等于指定的最小值 |
@Max(value) | 检查数值属性是否小于或等于指定的最大值 |
@Size(min=, max=) | 检查字符串、集合或数组等属性的大小是否在指定范围内 |
@Pattern(regexp=, flags=) | 检查字符串属性是否匹配指定的正则表达式 |
@DecimalMin(value) | 检查数值属性是否大于或等于指定的最小值(支持小数) |
@DecimalMax(value) | 检查数值属性是否小于或等于指定的最大值(支持小数) |
@Email(regexp=, flags=) | 检查字符串属性是否符合电子邮件的格式,也可以自定义正则表达式 |
@Future | 检查日期属性是否在当前日期之后 |
@Past | 检查日期属性是否在当前日期之前 |
@Digits(integer=, fraction=) | 检查数值的整数部分和小数部分是否满足指定的位数要求 |
Hibernate Validator 扩展的注解
注解 | 描述 |
---|---|
检查被注解的元素是否是一个有效的电子邮件地址 | |
@Length(min=, max=) | 检查字符串的长度是否在指定的最小值和最大值之间 |
@NotEmpty | 检查被注解的字符串、集合、Map或数组是否不为null且不为空(对于字符串,长度大于0;对于集合、Map或数组,包含至少一个元素) |
@NotBlank | 检查被注解的字符串是否不为null且去除首尾空格后长度大于0 |
@Range(min=, max=) | 检查数值是否在指定的最小值和最大值之间 |
@URL(protocol=, host=, port=, regexp=, flags=) | 检查被注解的字符串是否是一个有效的URL,并可根据需要指定协议、主机名、端口等条件 |
@CreditCardNumber | 检查被注解的字符串是否是一个有效的信用卡号,通常通过Luhn算法验证 |
@Valid与@Validated
@VALID | @VALIDETED | |
---|---|---|
所属 | 由Bean Validation 定义 | 由Spring Validation 定义 |
分组校验 | × | √ |
嵌套校验 | √ | × |
在Spring框架中,@Valid
和@Validated
是两个常用的数据校验注解,它们的使用场景和功能有所不同。以下通过具体例子来说明这两个注解的应用。
@Valid 示例
假设有一个用户注册的功能,在Spring MVC的Controller层中接收用户信息并进行校验。
java
@RestController
public class UserController {
@PostMapping("/register")
public ResponseEntity<String> registerUser(@Valid @RequestBody User user) {
// 处理用户注册逻辑
// ...
return ResponseEntity.ok("User registered successfully!");
}
}
// User类定义了用户信息,并使用JSR-303注解进行约束
public class User {
@NotNull(message = "用户名不能为空")
private String username;
@Email(message = "邮箱格式错误")
private String email;
// 省略getter和setter方法
}
在这个例子中,@Valid
注解被加在User
对象上,用于在接收HTTP请求体(通过@RequestBody
注解绑定)时自动校验User
对象的字段是否符合约束条件(如用户名不能为空,邮箱格式必须正确)。如果校验失败,Spring会自动返回相应的错误信息给客户端。
@Validated 示例
再来看一个服务层(Service Layer)中使用@Validated
注解的例子。
java
@Service
@Validated
public class UserService {
// 假设有一个用户更新的功能,只对特定字段进行校验
public void updateUser(@Validated(Update.class) User user) {
// 处理用户更新逻辑
// ...
}
}
// 定义校验分组
public interface Update {
}
// User类中添加分组校验的注解
public class User {
@NotNull(message = "用户名不能为空")
private String username;
@Email(message = "邮箱格式错误", groups = Update.class)
private String email;
// 省略getter和setter方法
}
- 两个注解不需要全加,一般取一即可
- 不仅仅是类上面,对于service的接口也可以加