2010-11-05 2 views
39

Можно ли проверить коллекцию объектов в JSR 303 - Проверка Jave Bean, где сама коллекция не содержит каких-либо аннотаций, но элементы, содержащиеся внутри, делают?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); 

ответ

55

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

Здесь an example из справки валидатора Hibernate.

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

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

+0

хорошо, намного лучше! – cam

+0

Я предполагаю, что в этом случае проверка @NotNull будет проверять как то, что список pasengers не равен null, и что Person в каждом элементе массива не является Null. Не так ли? – borjab

+0

Нет ... см. Https://stackoverflow.com/questions/27984137/java-beans-validation-collection-map-does-not-contain-nulls – Archie

2

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

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

Нет

+0

Я использую JAX-RS и имею список объектов json, которые я разбираю в списке java beans. У меня нет объекта-оболочки для списка, поэтому никакого свойства для аннотации ... Я думал, что если это будет общей проблемой при отсутствии фасовочного компонента, вместо создания новой оболочки для каждого типа списка проще было бы просто комментировать общий подкласс списка.Я думаю, что это также было бы осуществимо, хотя бы с обобщенным bean-компонентом, который вы предлагаете, например: открытый класс ValidatableListBean > { @Valid закрытый T-лист; } – cam

+0

На самом деле, возможно, что класс будет выглядеть следующим образом: общественный класс ValidatableBeanList { @Valid частный Список список; } – cam

+0

ValidatableBeanList представляется разумным для вашего использования. – Hardy

17

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

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

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

0

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

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