Подтвердить что ты не робот

JSR 303: Как проверить коллекцию аннотированных объектов?

Можно ли проверить коллекцию объектов в 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);
4b9b3361

Ответ 1

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

Вот пример из справки о слиянии с гибернатом.

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

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

Ответ 2

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

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

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

Ответ 3

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

Можно ли проверить сбор объектов в JSR 303 - Jave bean Проверка, где сама коллекция не имеет аннотации, но элементы, содержащиеся внутри do?

Нет

Ответ 4

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

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 для оберточного объекта.

Ответ 5

Оба эти подхода работают:

private List<@Valid MyBean> beans;

или

@Valid
private List<MyBean> beans;