首页 > 解决方案 > 验证空值的成员列表变量

问题描述

我拥有的结构如下所示:

Class A{
    String str;
    int i;
    List<B> bs;
    C c;
    @NotNull
    List<D> ds;
}

Class B{
    @NotNull
    List<E> es;
}

Class C{
    List<String> s;
}

Class E{
    @NotNull
    List<String> s;
}

对于使用@NotNull 注释的列表变量,如果其中任何一个变量具有一个或多个空对象,我需要抛出验证错误。而对于其他列表变量,我只需要删除空值;实现这一目标的最佳方法是什么?

标签: javavalidationspring-bootcollectionsjava-8

解决方案


您应该定义自定义注释以进行验证。

所以定义自定义注释,如下所示。

@Target({ElementType.FIELD, ElementType.PARAMETER,ElementType.ANNOTATION_TYPE})
@Retention(RUNTIME)
@Constraint(validatedBy = ValidateListValidator.class)
@Documented
public @interface ValidateList {
} 

ValidateListValidator像这样实现:

public class ValidateListValidator implements ConstraintValidator<ValidateList, List<Object>> {

private ValidateList validateList;
@Override
public void initialize(ValidateList validateList) {
    this.validateList = validateList;
}

@Override
public boolean isValid( List<Object> list, ConstraintValidatorContext constraintValidatorContext) {
    return list.stream().noneMatch(Objects::isNull);
  }

 }

并进行测试

@Test
public void test() {
    boolean valid = validator.isValid(Arrays.asList("test","this",null),context);
    assertThat(valid, is(false));
} 

推荐阅读