JSR 303: как проверить коллекцию аннотированных объектов? - PullRequest
44 голосов
/ 05 ноября 2010

Можно ли проверить коллекцию объектов в JSR 303 - Валидация Jave Bean, где у самой коллекции нет аннотаций, но есть элементы, содержащиеся в do?привести к нарушению ограничения из-за нулевого имени второго лица:

List<Person> people = new ArrayList<Person>();
people.add(new Person("dave"));
people.add(new Person(null));

Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
Set<ConstraintViolation<List<Person>>> validation = validator.validate(people);

Ответы [ 4 ]

61 голосов
/ 21 августа 2011

Да, просто добавьте @Valid в коллекцию.

Вот пример из справочника валидатора Hibernate.

public class Car {
  @NotNull
  @Valid
  private List<Person> passengers = new ArrayList<Person>();
}

Это стандартное поведение JSR-303. См. Раздел 3.1.3 spec .

20 голосов
/ 13 марта 2012

Вы также можете добавить @NotEmpty в коллекцию.

public class Car {
  @NotEmpty(message="At least one passenger is required")
  @Valid
  private List<Person> passengers = new ArrayList<Person>();
}

это обеспечит присутствие хотя бы одного пассажира, а аннотация @Valid гарантирует, что каждый Person объект проверен

2 голосов
/ 07 ноября 2010

Конечно, вы можете просто перебрать список и вызвать Validator.validate для каждого элемента. Или поместите List в некоторый bean-компонент-оболочку и аннотируйте его с помощью @Valid. Расширение ArrayList для проверки мне кажется неправильным. У вас есть конкретный вариант использования, который вы хотите решить с этим? Если так, может быть, вы можете объяснить это немного больше. Чтобы ответить на ваш первоначальный вопрос:

Возможно ли подтвердить коллекция объектов в JSR 303 - Валидация Боба, где Сама коллекция не имеет аннотации, но элементы содержат внутри делать?

нет

Нет

0 голосов
/ 02 августа 2016

Я написал этот общий класс:

public class ValidListWrapper<T> {

    @Valid
    private List<T> list;

    public ValidListWrapper(List<T> list) {
        this.list = list;
    }

    public List<T> getList() {
        return list;
    }

}

Если вы используете библиотеку Джексона для десериализации JSON, вы можете добавить аннотацию @JsonCreator в конструктор, и Джексон автоматически десериализует массив JSON для объекта-оболочки.

...