Как отклонить недопустимое значение из валидатора List in Spring? - PullRequest
0 голосов
/ 15 ноября 2018

Я получаю список идентификаторов объектов домена, десериализованных из JSON тела запроса клиента:

@JsonProperty("workgroups")
private List<WorkgroupId> workgroupIds = new ArrayList<>();

Мне нужно проверить эти идентификаторы в org.springframework.validation.Validator.

for (WorkgroupId workgroupId : project.getWorkgroupIds()) {
  if (!domainObjectTools.doesWorkgroupExist(workgroupId)) {
// reject this invalid value here...
  }
}

Вопрос

Как отклонить недопустимое значение в org.springframework.validation.Errors?

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Вы можете использовать reject () и / или rejectValue () вместе с полем / кодом ошибки / defaultMessage или вместе с пользовательским валидатором для отклонения значений.

0 голосов
/ 15 ноября 2018

Интерфейс валидатора:

@Target({ ElementType.FIELD, ElementType.ANNOTATION_TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = { CustomValidatorValidator.class })
@Documented
public @interface CustomValidator{
    String message() default "Put here your default message";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

ValidatorImplementation:

public final class CustomValidatorValidator implements ConstraintValidator<CustomValidator, List<WorkgroupId>> {

    @Override
    public void initialize(CustomValidator constraintAnnotation) {

    }

    @Override
    public boolean isValid(List<WorkgroupId> yourlist, ConstraintValidatorContext context) {
        if (yourlist== null)
            return true;
        else
            return yourlist.stream().anyMatch(s -> /* filter here as you want */);
    }
}

Обратите внимание, что мы возвращаем true, если поле равно нулю, я делаю это так, потому что я просто установил ограничение @NotNull, если мне не нужно быть пустым, чтобы у меня был больший контроль над ограничением.

Наконец:

@JsonProperty("workgroups")
@CustomValidator
private List<WorkgroupId> workgroupIds = new ArrayList<>();

П.С .: Я не понимаю, почему вы инициализируете список в этом последнем коде. Если это поле вы должны получить через запрос, то вам не нужно его инициализировать, десериализатор json инициализирует его с помощью входящего поля в json.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...