Существует ли стандартный способ включения проверки bean-компонента JSR 303 с использованием аргументов аннотированного метода - PullRequest
10 голосов
/ 04 февраля 2011

Я уже некоторое время ищу безуспешно. Я не использую 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 Validator для использования Spring MVC ).

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

Ответы [ 3 ]

7 голосов
/ 05 февраля 2011

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

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

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

4 голосов
/ 05 февраля 2011

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

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

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

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

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

1 голос
/ 11 февраля 2019

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

...