Проверка компонента уровня сервиса весной 5?

#java #spring #bean-validation

#java #весна #проверка компонента

Вопрос:

Мне нужно проверить компоненты, указанные в качестве аргумента для методов уровня сервиса в приложении Spring 5. Я могу заставить проверку работать на контроллерах, но на уровне сервиса аннотация @Valid игнорируется. Класс service помечен символом @Validated, и его экземпляр автоматически подключается к классу контроллера, который вызывает метод.

Мне нужно сделать это в не загружаемом приложении. Я нашел несколько инструкций, но они были специфичны для загрузки.

Чего мне здесь не хватает, почему это работает на контроллере, но не на вызове с контроллера на уровень сервиса? Основываясь на некотором поиске в Google, на уровне контроллера это может быть как-то связано с DispatcherServlet?

Что мне нужно сделать, чтобы это работало на уровне сервиса? Причина, по которой я хочу сделать это на уровне сервиса, заключается в том, что у нас есть проверка на уровне сервиса в других приложениях (Jersey framework более старая Spring), а другие хотят согласованности.

Ответ №1:

Причина, по которой это работает для @Controller методов обработчика класса, заключается в том, что Spring использует специальный HandlerMethodArgumentResolver вызываемый ModelAttributeMethodProcessor , который выполняет проверку перед разрешением аргумента для использования в вашем методе обработчика.

Уровень сервиса, как мы его называем, — это просто компонент без дополнительного поведения.

Вы можете явно использовать SpringValidator

 @Bean
public SpringValidator<ClassToValidate> springValidator() {
        SpringValidator<ActivityCsvDTO> springValidator = new SpringValidator<>();
        springValidator.setValidator(localValidatorFactoryBean());
        return springValidator;
    }
  

и метод прямого вызова validate()

     try {
     springValidator.validate(ObjectToValidate);
    } catch (Exception e) {
      return log.error("error validation", e);
    }
  

Комментарии:

1. Большое спасибо. Итак, нет ли способа заставить это работать только с помощью конфигурации? Я бы действительно хотел избежать необходимости явно вызывать что-либо. Как я уже сказал, у нас есть другие приложения, в основном другие конечные точки того же веб-приложения, которые запускаются на другом сервлете, и этот сервлет настроен с помощью Jersey Framework и Spring. Каким-то образом проверка работает на этом другом сервлете. Конфигурация с этими фреймворками немного сложная, а версия spring отличается, поэтому я не совсем уверен, работает ли ее Джерси, который позволяет выполнять проверку, или в конфигурациях есть что-то, чего мне не хватает.

2. Хммм, я думаю, я должен быть в состоянии выполнить проверку компонента уровня сервиса, используя MethodValidationPostProcessor. Я протестировал это в отдельном простом проекте Spring 5, и это работает. Мне нужны были компоненты LocalValidatorFactoryBean и MethodValidationPostProcessor и валидатор, подобный Hibernate validator, в моем pom.xml . И мне нужно было аннотировать класс сервиса с помощью @Validated. Итак, мне просто нужно углубиться в конфигурации проекта, над которым я работаю. Как уже было сказано, это немного сложно, поскольку одно и то же приложение имеет два сервлета, которые запускают разные фреймворки. В любом случае, спасибо за вашу помощь!