Spring Проверить список строк для непустых элементов

У меня есть класс модели со списком строк. Список может быть пустым или содержать элементы. Если у него есть элементы, эти элементы не могут быть пустыми. В качестве примера предположим, что у меня есть класс с именем QuestionPaper, в котором есть список идентификаторов вопросов, каждый из которых является строкой.

class QuestionPaper{
private List<String> questionIds;
....
}

В документе может быть ноль или более вопросов. Но если есть вопросы, значения id не могут быть пустыми строками. Я пишу микросервис, используя SpringBoot, Hibernate, JPA и Java. Как я могу сделать эту проверку. Любая помощь приветствуется.

Например, нам нужно отклонить следующий ввод json от пользователя.

{ "examId": 1, "questionIds": [ "", " ", "10103" ] }

Есть ли какой-нибудь готовый способ добиться этого, или мне придется написать для этого собственный валидатор.


person Ravindra Ranwala    schedule 15.09.2016    source источник
comment
почему бы тебе не бросить исключение   -  person emotionlessbananas    schedule 15.09.2016


Ответы (5)


Пользовательская аннотация проверки не должна быть проблемой:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = NotEmptyFieldsValidator.class)
public @interface NotEmptyFields {

    String message() default "List cannot contain empty fields";

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

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

}


public class NotEmptyFieldsValidator implements ConstraintValidator<NotEmptyFields, List<String>> {

    @Override
    public void initialize(NotEmptyFields notEmptyFields) {
    }

    @Override
    public boolean isValid(List<String> objects, ConstraintValidatorContext context) {
        return objects.stream().allMatch(nef -> nef != null && !nef.trim().isEmpty());
    }

}

Использование? Простой:

class QuestionPaper{

    @NotEmptyFields
    private List<String> questionIds;
    // getters and setters
}

P.S. Логику не проверял, но, думаю, хорошо.

person Branislav Lazic    schedule 15.09.2016
comment
Проверка выглядит так, как будто она рухнет на nef==null - person Zarremgregarrok; 18.09.2018
comment
Я редактирую код, как показано ниже, и он отлично работает: @Override public boolean isValid (List‹String› объекты, контекст ConstraintValidatorContext) { if (objects == null || objects.isEmpty()) return false; return objects.stream().allMatch(nef -> nef != null && !nef.trim().isEmpty()); } - person Vickie Jack; 06.03.2020

Этого может быть достаточно, если это только нулевое или пустое пространство.

@NotNull, @Valid, @NotEmpty

Вы можете проверить это на примере. Полный набор валидаций - JSR 303 дает представление, которое соответствует требованиям.

person VinayVeluri    schedule 15.09.2016
comment
Я уже пробовал, но они не применяются рекурсивно к элементам списка, а применяются к списку. Спасибо за ответ. :) - person Ravindra Ranwala; 15.09.2016

У меня просто был похожий случай, чтобы решить

class QuestionPaper {

    @NotEmpty
    private List<@NotBlank String> questionIds;

    // getters and setters
}
person nmgds    schedule 30.06.2021

Это можно легко решить, если вы используете

import org.apache.commons.collections.CollectionUtils;

    QuestionPaper question = new QuestionPaper();
    question.setQuestionIds(Arrays.asList("", " ", "10103"));

   if(CollectionUtils.isNotEmpty(question.getQuestionIds())) {
        // proceed
    } else {
        //throw exception or return
    }

Это проверит наличие nontnull и notempty.

person Shweta Shaw    schedule 17.06.2019

person    schedule
comment
Это также работает, List‹String› questionIds = Arrays.asList(1000, , ); if (!questionIds.contains(null) && !questionIds.contains()) { System.out.println(Действительный список!!!!); } else { System.out.println(Недопустимый список!!!!); } Меня беспокоит, как добавить это в валидатор Spring. - person Ravindra Ranwala; 15.09.2016
comment
Я не уверен, работает ли Bean Validation со ссылками. - person Journeycorner; 15.09.2016