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

StackOverflow https://stackoverflow.com/questions/4106772

Вопрос

Можно ли проверить коллекцию объектов в 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 для объекта обертки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top