JSR 303: Как подтвердить коллекцию аннотированных объектов?
-
29-09-2019 - |
Вопрос
Можно ли проверить коллекцию объектов в JSR 303 - валидация фасоли Жаж, где сама коллекция не имеет никаких аннотаций, а элементы, содержащиеся внутри?
Например, возможно ли это, чтобы это привело к нарушению ограничений из-за нулевого имени во втором лице:
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);
Решение
Да, просто добавить @Valid
в коллекцию.
Вот пример от справки Hibernate Validator.
public class Car {
@NotNull
@Valid
private List<Person> passengers = new ArrayList<Person>();
}
Это стандартное поведение JSR-303. См. Раздел 3.1.3 из спецификация.
Другие советы
Вы можете добавить @NotEmpty
в коллекцию.
public class Car {
@NotEmpty(message="At least one passenger is required")
@Valid
private List<Person> passengers = new ArrayList<Person>();
}
Это обеспечит хотя бы один пассажир присутствует и @Valid
Аннотация гарантирует, что каждый Person
Объект подтвержден
Конечно, вы также можете просто перейти по поводу перечисления и вызовов Validator.Validate на каждом элементе. Или поставьте список в несколько бобов обертки и аннотируйте его с @Valid. Расширение ArrayList для проверки кажется неверным для меня. У вас есть особый случай, если вы хотите решить с этим? Если да, может быть, вы можете объяснить это немного больше. Чтобы ответить на ваш первоначальный вопрос:
Можно ли проверить коллекцию объектов в JSR 303 - валидация фасоли Жаж, где сама коллекция не имеет никаких аннотаций, а элементы, содержащиеся внутри?
Нет
Я написал этот универсальный класс:
public class ValidListWrapper<T> {
@Valid
private List<T> list;
public ValidListWrapper(List<T> list) {
this.list = list;
}
public List<T> getList() {
return list;
}
}
Если вы используете библиотеку Jackson для десериализации JSON, вы можете добавить @JsonCreator
Аннотация на конструкторе и Джексоне автоматически определяет массив JSON для объекта обертки.