人的知识就好比一个圆圈,圆圈里面是已知的,圆圈外面是未知的。你知道得越多,圆圈也就越大,你不知道的也就越多。

0%

后端框架-接口参数校验

在企业级服务开发当中,开发人员经常犯的一个错误就是忽略对接口参数做必要的校验,造成调用异常,甚至关键服务挂掉,所以开发人员必须重视参数校验。

因为参数校验和具体业务场景是相关的,一般无法做到自动化,因此参数校验主要是业务开发人员的职责。当然,服务框架应该提供必要的支持,方便开发人员对请求参数添加必要的校验。

在接口参数校验这方面,Spring 提供了完善的支持,我们只需在 Controller 接口参数前添加相关注解,即可实现对应的参数校验。

基础校验

  • NotNull
  • NotEmpty
  • NotBlank
  • Size
  • Digits
  • Max
  • Min
  • DecimalMax
  • DecimalMin
  • Positive
  • PositiveOrZero
  • Negative
  • NegativeOrZero
  • AssertTrue
  • AssertFalse
  • Email
  • Pattern
  • Null
  • Past
  • PastOrPresent
  • Future
  • FutureOrPresent

对象校验

如果参数是对象类型,我们需要在该参数前面添加 @Valid 注解,然后在对象属性上添加前面列出的基础校验注解。

自定义校验

我们也可以手动创建相关注解,已实现自定义校验。下面以创建子表非空检验(逻辑删除)为例进行演示。

  1. 创建注解

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @Constraint(validatedBy = SublistNotEmptyValidator.class)
    @Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface SublistNotEmpty {

    String message() default "{javax.validation.constraints.NotEmpty.message}";

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};
    }
  2. 创建注解解析器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class SublistNotEmptyValidator implements ConstraintValidator<SublistNotEmpty, List<? extends LogicDeleteAware>> {

    @Override
    public void initialize(SublistNotEmpty constraintAnnotation) {

    }

    @Override
    public boolean isValid(List<? extends LogicDeleteAware> value, ConstraintValidatorContext context) {
    return !CollectionUtils.isEmpty(value) && !value.stream().allMatch(LogicDeleteAware::isDeleted);
    }
    }

校验示例

基础校验:

1
2
3
4
@GetMapping("account")
public AccountVo getAccount(@RequestParam @NotBlank String userId) {
...
}

对象校验:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@PostMapping("save")
public AccountVo save(@RequestBody @Valid AccountVo vo) {
...
}

public class AccountVo {
@NotBlank(message = "账号名不能为空")
private String accountName;

@SublistNotEmpty(message = "账号明细不能为空")
@Valid
private List<AccountDetailVo> accountDetails;

...
}
小礼物走一走,来 Github 关注我