Есть ли стандартный способ включить JSR 303 Bean Validation с использованием аргументов аннотированного метода

Я уже некоторое время оглядываюсь, но безуспешно. Я не использую Spring MVC, но все же хочу использовать @javax.validation.Valid, чтобы включить проверку аргументов метода. Чтобы привести пример

public class EventServiceImpl implements IEventService {
    @Override
    public void invite(@Valid Event event, @Valid User user) { ... }
}

Используя MVC, это можно включить для @Controller аннотированных bean-компонентов с помощью простого <mvc:annotation-driven/> (см. 5.7.4.3 Настройка валидатора JSR-303 для использования в Spring MVC).

Использование АОП должно быть довольно тривиальным. Тем не менее, я подозреваю, что есть какой-то стандартный способ сделать это. Отсюда вопрос: есть ли что-то подобное для приложений, не являющихся MVC, и неконтроллерных bean-компонентов, чтобы включить проверку ввода для аннотированных bean-компонентов?


person sfussenegger    schedule 04.02.2011    source источник


Ответы (3)


Проверка уровня метода не является частью спецификации Bean Validation (JSR 303). Проверка уровня метода - это предложение в спецификации, добавленной в приложении C.

Hibernate Validator 4.2 (бета-версия уже вышла) реализует это предложение и позволяет размещать аннотации JSR 303 к параметрам метода и возвращаемым значениям. Конечно, вам все равно понадобится связующий код Spring, но это не должно быть слишком сложно.

Также Bean Validation 1.1 официально добавит в спецификацию проверку уровня метода (а не только как приложение / рекомендацию). См. Также http://beanvalidation.org/.

person Hardy    schedule 05.02.2011

Используя MVC, это включено для аннотированных bean-компонентов @Controller.

@Valid - это просто маркер в bean-компонентах Controller, который скрывает код, выполняющий проверку, и аккуратно помещает все нарушения ограничений в Errors. Дизайнеры Spring могли бы придумать собственную аннотацию, чтобы сделать то же самое.

Реальное использование аннотации @Valid находится в классе (компоненте), который вы проверяете с помощью валидатора JSR 303, и его основное использование - проверка графа объекта. Это означает, что один bean-компонент может иметь ссылки на другие bean-компоненты с аннотацией @Valid для рекурсивного запуска проверки.

Вне MVC вы можете использовать настроенный валидатор для проверки любого bean-компонента, который использует аннотации JSR 303, но, в отличие от хорошо заполненного Errors в контроллере, вам придется решать самостоятельно, что вы собираетесь делать с нарушениями ограничений.

Итак, чтобы ответить на ваш вопрос, стандартного способа не существует. Чтобы иметь такой же внешний вид, как и в контроллере, вы можете использовать аннотацию @Valid (или создать новую) для запуска совета AOP для проверки bean-компонента и заполнения ViolationCollector (что-то вроде ошибок в MVC), который должен быть передан в метод.

person Ritesh    schedule 05.02.2011

Ответы кажутся довольно старыми. На данный момент вы можете использовать @Validated и MethodValidationPostProcessor для встроенной проверки методов любых компонентов Spring. Они в основном отвечают за создание поведения, подобного pointcut, для управляемых компонентов Spring любого уровня, а не конкретно для контроллеров. Также см. Мой другой ответ.

person yuranos    schedule 11.02.2019