Spring 自定义校验 List 中每个元素都不为空
概述
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 中自定义校验规则还是相当简单的,整个过程相当的模式化:定义自定义注解,并定义一个实现类即可。
有问题吗?点此反馈!
温馨提示:反馈需要登录