Spring 自定义校验 List 中每个元素都不为空

Last Modified: 2023/03/08

概述

Spring 提供了内置了不少校验规则,我们只需要使用注解即可完成绝大部分校验工作,但是有一些校验规则可能比较特殊,内置校验无法满足,此时我们可以选择自定义校验规则,本篇文章中我们就以校验 List<String> 中每个元素均不为空为例说明如何自定义校验规则。

想要达到的效果

我们需要自定义一个注解 NotBlankFields 来完成校验,该注解的功能就是校验 list 中的每个元素都不为空,使用方法如下:

public class SomeReq {

  @NotBlankFields(message = "list 中元素不能为空")
  private List<String> list;
  // ...省略 getter and setter
}

自定义注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NotBlankFields {
  String message() default "";
  Class<?>[] groups() default {};
  Class<? extends Payload>[] payload() default {};
}

用于校验的注解包含三个成员:message、groups 和 payload。这三个成员是固定的:

  • message 用于指定校验失败的错误消息;
  • groups 用于分组校验,不知道分组校验的同学可以自行搜索;
  • payload 不常用,感兴趣的同学可以参考stackoverflow

自定义 validator

自定义 validator 需要实现 ConstraintValidator,其中最重要是 isValid 的实现,在该方法检查 list 中的每个元素是不是都不为空,实现方法如下:

import org.apache.commons.lang3.StringUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.List;

public class NotBlankFieldsValidator implements ConstraintValidator<NotBlankFields, List<String>> {

  @Override
  public void initialize(NotBlankFields notEmptyFields) {
  }
   
  @Override
  public boolean isValid(List<String> objects, ConstraintValidatorContext context) {
      return objects.stream().allMatch(StringUtils::isNotBlank);
  }
}

最后我们需要给我们的自定义注解加一个元注解 @Constraint,该元注解的作用是指定 @NotBlankFields 的校验实现类为 NotBlankFieldsValidator,修改后的注解实现如下:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = NotBlankFieldsValidator.class)
public @interface NotBlankFields {
  String message() default "";
  Class<?>[] groups() default {};
  Class<? extends Payload>[] payload() default {};
}

总结

在 spring 中自定义校验规则还是相当简单的,整个过程相当的模式化:定义自定义注解,并定义一个实现类即可。

有问题吗?点此反馈!

温馨提示:反馈需要登录