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);
Ответы
Ответ 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;