在企业级服务开发当中,开发人员经常犯的一个错误就是忽略对接口参数做必要的校验,造成调用异常,甚至关键服务挂掉,所以开发人员必须重视参数校验。
因为参数校验和具体业务场景是相关的,一般无法做到自动化,因此参数校验主要是业务开发人员的职责。当然,服务框架应该提供必要的支持,方便开发人员对请求参数添加必要的校验。
在接口参数校验这方面,Spring 提供了完善的支持,我们只需在 Controller 接口参数前添加相关注解,即可实现对应的参数校验。
基础校验
- NotNull
- NotEmpty
- NotBlank
- Size
- Digits
- Max
- Min
- DecimalMax
- DecimalMin
- Positive
- PositiveOrZero
- Negative
- NegativeOrZero
- AssertTrue
- AssertFalse
- Pattern
- Null
- Past
- PastOrPresent
- Future
- FutureOrPresent
对象校验
如果参数是对象类型,我们需要在该参数前面添加 @Valid 注解,然后在对象属性上添加前面列出的基础校验注解。
自定义校验
我们也可以手动创建相关注解,已实现自定义校验。下面以创建子表非空检验(逻辑删除)为例进行演示。
创建注解
1
2
3
4
5
6
7
8
9
10
11
12.class) (validatedBy = SublistNotEmptyValidator
@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
(RetentionPolicy.RUNTIME)
public SublistNotEmpty {
String message() default "{javax.validation.constraints.NotEmpty.message}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}创建注解解析器
1
2
3
4
5
6
7
8
9
10
11
12public class SublistNotEmptyValidator implements ConstraintValidator<SublistNotEmpty, List<? extends LogicDeleteAware>> {
public void initialize(SublistNotEmpty constraintAnnotation) {
}
public boolean isValid(List<? extends LogicDeleteAware> value, ConstraintValidatorContext context) {
return !CollectionUtils.isEmpty(value) && !value.stream().allMatch(LogicDeleteAware::isDeleted);
}
}
校验示例
基础校验:
1 | "account") ( |
对象校验:
1 | "save") ( |