Проверка списка bean-компонентов с использованием Bean Validation 2.0 (JSR-308) и Spring 5

Предполагается, что Spring 5 будет поддерживать Bean Validation 2.0, которая ввела валидацию для типов List, но я не могу заставить ее работать.

У меня есть следующая конечная точка в моем @RestController:

@PostMapping("/foos")
public List<Foo> analysePoints(@RequestBody @Valid List<@Valid Foo> request) {
    ...
}

Где у класса Foo есть некоторые аннотации проверки JSR на его свойствах.

К сожалению, это не подтверждает это вообще. До весны 5 я обошел это, завернув List<Foo> в отдельном объекте объекта запроса, и это тоже работает в этом случае, но я не хочу этого делать, потому что это изменяет формат требуемого json.

Есть ли способ заставить это работать?

1 ответ

Решение

javax.validation не будет проверять список, только JavaBean. Обходной путь должен использовать настроенный класс List:

Вместо

@RequestBody @Valid List<@Valid Foo> request

Использование:

@RequestBody @Valid ValidList<@Valid Foo> request

ValidList

public class ValidList<E> implements List<E> {

    @Valid
    private List<E> list;

    public ValidList() {
        this.list = new ArrayList<E>();
    }

    public ValidList(List<E> list) {
        this.list = list;
    }

    // Bean-like methods, used by javax.validation but ignored by JSON parsing

    public List<E> getList() {
        return list;
    }

    public void setList(List<E> list) {
        this.list = list;
    }

    // List-like methods, used by JSON parsing but ignored by javax.validation

    @Override
    public int size() {
        return list.size();
    }

    @Override
    public boolean isEmpty() {
        return list.isEmpty();
    }

    // Other list methods ...
}
Другие вопросы по тегам