Подтвердить что ты не робот

Конфигурация Java для перехватчика spring, где перехватчик использует autwired spring beans

Я хочу добавить перехватчик mvc spring как часть конфигурации Java. У меня уже есть xml-конфигурация для этого, но я пытаюсь перейти к конфигурации Java. Для перехватчиков я знаю, что это можно сделать из документации spring -

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LocaleInterceptor());
    }

}

Но мой перехватчик использует spring bean в нем, как показано ниже -

public class LocaleInterceptor extends HandlerInterceptorAdaptor {

    @Autowired
    ISomeService someService;

    ...
}

Класс SomeService выглядит следующим образом:

@Service
public class SomeService implements ISomeService {

   ...
}

Я использую аннотации, такие как @Service для сканирования beans и не указали их в классе конфигурации как @Bean

Как я понимаю, поскольку java config использует new для создания объекта, spring не будет автоматически вставлять в него зависимостей.

Как добавить такие перехватчики как часть java config?

4b9b3361

Ответ 1

Просто сделайте следующее:

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    LocaleInterceptor localInterceptor() {
         return new LocalInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeInterceptor());
    }

}

Конечно, LocaleInterceptor должен быть где-то сконфигурирован как bean-компонент Spring (XML, Java Config или с использованием аннотаций), чтобы соответствующее поле WebConfig быть введено.

Документацию по общей настройке конфигурации Spring MVC можно найти здесь, а для перехватчиков - в этом разделе.

Ответ 2

Когда вы обрабатываете создание объекта для себя, как в:

registry.addInterceptor(new LocaleInterceptor());

нет способа, которым контейнер Spring может управлять этим объектом для вас и, следовательно, сделать необходимую инъекцию в ваш LocaleInterceptor.

Другим способом, который может быть более удобным для вашей ситуации, является объявить управляемый @Bean в @Configuration и использовать метод напрямую, например:

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Bean
    public LocaleInterceptor localeInterceptor() {
        return new LocaleInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor( localeInterceptor() );
    }
}

Ответ 3

Попробуйте ввести службу как параметр конструктора. Это просто.

@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

   @Autowired
   ISomeService someService;

   @Override
   public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LocaleInterceptor(someService));
   }

}

Затем переконфигурируйте ваш перехватчик,

public class LocaleInterceptor extends HandlerInterceptorAdaptor {


     private final ISomeService someService;

     public LocaleInterceptor(ISomeService someService) {
         this.someService = someService;
     }


}

Приветствия!