Я пытаюсь настроить стек библиотек через spring java @Configuration
.
На одной из вершин всего у меня есть приложение Spring Web Mvc.Инициализация конфигурации Spring Web Mvc
Для настройки приложения я использовал расширение AbstractAnnotationConfigDispatcherServletInitializer
; оттуда я ссылался на другой класс @Configuration
для нижележащих слоев в методе getRootConfigClasses()
, и для контейнера сервлета я использовал метод getServletConfigClasses()
для ссылки на расширение WebMvcConfigurationSupport
.
Все работает хорошо (часть веб-MVC), пока мне не понадобятся некоторые компоненты из нижележащих слоев из классов, созданных на уровне WebMvcConfigurationSupport
(перехватчики и т. Д.); В этих классах все ссылки на beans, которые должны быть инициализированы в нижележащих слоях (это классы, аннотированные @Component
) с аннотацией @Autowired
, дают мне null
.
В другом приложении поверх того же слоя слоев (сервисный слой без MVC) все работает хорошо.
Любые предложения?
EDIT
Если я загружаю боб (через @Bean аннотацию) из конфигурации корневого класса автоматического связывания работ.
Если я загружаю компонент (с помощью аннотации @Bean) из сервлета (WebMvc), автоустановка класса конфигурации не работает.
Кажется, что это два разных контекста Весны.
НЕКОТОРЫХ КОД
Перехватчик
package my.package.interceptor;
@Component
public class AuthenticationInterceptor extends HandlerInterceptorAdapter {...}
Корень конфигурации
package my.package;
@Configuration
@ComponentScan(
basePackageClasses={ UnderlyingLayersSpringConfiguration.class },
basePackages = {"my.package.interceptor"}
)
public class WebSpringConfiguration {...}
MVC конфигурации
package my.package;
@Configuration
@EnableWebMvc
@ComponentScan(
basePackageClasses = WebSpringConfiguration.class,
basePackages = {"my.package.interceptor"},
includeFilters = @Filter(Controller.class) ,
useDefaultFilters = false
)
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Autowired
private AuthenticationInterceptor authenticationInterceptor;
}
Веб-приложение инициализатор: 2 версии
Version 1
package my.package;
public class WebAppInitializer
extends AbstractAnnotationConfigDispatcherServletInitializer
implements WebApplicationInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { WebSpringConfiguration.class, WebMvcConfig.class };
@Override
protected Class<?>[] getServletConfigClasses() {
return null;
}
}
Version 2
package my.package;
public class WebAppInitializer
extends AbstractAnnotationConfigDispatcherServletInitializer
implements WebApplicationInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class<?>[] { WebSpringConfiguration.class };
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { WebMvcConfig.class };
}
}
Ошибка
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [my.package.interceptor.AuthenticationInterceptor] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
Другие классы в тех же пакетах поддерживают autowire? – Priyamal