Добавление ограничений @NotNull или Pattern в List‹String›

Как мы можем гарантировать, что отдельные строки внутри списка не являются нулевыми/пустыми или не следуют определенному шаблону

@NotNull
List<String> emailIds;

Я также хочу добавить шаблон

@Pattern("\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b.")

но я могу жить без него. Но я определенно хотел бы иметь ограничение, которое будет проверять, являются ли какие-либо строки внутри списка нулевыми или пустыми. Также как будет выглядеть схема Json

"ids": {
      "description": "The  ids associated with this.", 
    "type": "array",
        "minItems": 1,
        "items": {
        "type": "string",
         "required" :true }
 }

"required" :true does not seem to do the job

person Abhijeet Kushe    schedule 06.03.2014    source источник
comment
Почему бы не создать объект, а не строку, и применить шаблон при создании объекта. Скажем, List‹EMailInfo› eMailIds; Класс EMailInfo (String emailid) .. проверить правильность, вернуть null, если неверно; и используйте метод получения идентификаторов электронной почты в этом классе   -  person ErstwhileIII    schedule 06.03.2014
comment
Создать производный класс List, чей переопределенный метод add() делает все это?   -  person Mark W    schedule 06.03.2014
comment
Проверьте это stackoverflow.com/questions/4308224/   -  person Guy Bouallet    schedule 06.03.2014


Ответы (4)


Вы можете создать простой класс-оболочку для строки электронной почты:

public class EmailAddress {

    @Pattern("\b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}\b.")
    String email;

    //getters and setters
}

Затем отметьте поле @Valid в существующем объекте:

@NotNull
@Valid
List<EmailAddress> emailIds;

Затем валидатор проверит каждый объект в списке.

person ach    schedule 06.03.2014

Проверка компонентов 2.0 (Hibernate Validator 6.0.1 и выше) поддерживает проверку элементов контейнера путем аннотирования аргументов типа параметризованных типов. Пример:

List<@Positive Integer> positiveNumbers;

Или даже (хотя немного занят):

List<@NotNull @Pattern(regexp="\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}\\b") String> emails;

Использованная литература:

person Brice Roncace    schedule 07.06.2018
comment
ты спас мой день! - person Next Developer; 04.04.2019

Вам не нужно использовать какой-либо класс-оболочку только для проверки списка строк. Просто используйте ограничение @EachPattern из validator-collection:

@NotNull
@EachPattern(regexp="\b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}\b.")
List<String> values;

И это все. Легко, верно? См. этот ответ SO для получения дополнительной информации.

person Jakub Jirutka    schedule 03.04.2014
comment
не уверен, что я бы рекомендовал использовать стороннюю библиотеку только для проверки списка строк. - person mre; 06.05.2018
comment
тем более, что он уже даже не обновляется активно - person Deniss M.; 26.10.2020

На мой взгляд, используйте класс-оболочку для объекта и проведите собственную проверку методов:

public class ListWrapper<E> {

    private List<E> list = new ArrayList<>();
    private Pattern check = /*pattern*/;

    public boolean add(E obj) {
        if (this.verify(obj)) {
            return list.add(obj);
        }
        return false;
    }

    //etc

    public boolean verify(E obj) {
        //check pattern and for null
    }

В качестве альтернативы просто используйте пользовательский объект для списка

person Rogue    schedule 06.03.2014
comment
Я бы предпочел расширить arraylist, чем обернуть его. Прямо сейчас методы, которые принимают List‹T› в качестве параметра, не могут принимать этот класс - person Oskar Kjellin; 06.03.2014
comment
Каждому свое, зависит от варианта использования, я полагаю - person Rogue; 06.03.2014