Проверка правильности списка значений переменных для нулевых значений - PullRequest
0 голосов
/ 28 мая 2018

Структура, которая у меня есть, выглядит примерно так:

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, мне нужно выдать ошибку проверки, если какая-либо из этих переменных имеет один или несколько нулевых объектов.В то время как для других переменных списка мне просто нужно удалить нули;Каков наилучший способ достичь этого?

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Если вы используете проверку 2.0+, вы можете поместить аннотацию внутри: List<@NotNull String> s;

0 голосов
/ 30 мая 2018

Это последний код, который я написал, всего несколько настроек кода, который Хади опубликовал.Надеюсь, это поможет: Аннотация:

import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;


@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = ListValidator.class)
@Documented
public @interface ValidList {
  String message() default "Null values are not allowed in array fields.";

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

  Class<? extends Payload>[] payload() default {};
}

Класс валидатора:

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

public class ListValidator implements ConstraintValidator<ValidList, List<? extends Object>> {

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

  @Override
  public void initialize(ValidList constraintAnnotation) {}
}
0 голосов
/ 28 мая 2018

Вы должны определить пользовательскую аннотацию для проверки.

, поэтому определите пользовательскую аннотацию, как показано ниже.

@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));
} 
...