2016-04-21 1 views
0

Я пытаюсь настроить стек библиотек через 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)} 
+0

Другие классы в тех же пакетах поддерживают autowire? – Priyamal

ответ

0

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

Бобы нижнего слоя наследуются от структуры классов, где использовалась пружина @Profile.

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

Довольно просто, время, когда оно считается.

Надеюсь, это может помочь кому-то.

0

Контекст корневого контекста и диспетчера сервлетов действительно представляют собой два разных контекста. Корневой контекст - это родительский контекст сервлета.

Возможно, вы не указали аннотацию @ComponentScan в классе, настраивающем контекст сервлета.

+0

Я добавил код. Вы видите что-то не так? –

+0

'basePackages' и' basePackageClasses' являются альтернативами, не указывайте их, особенно если они не определяют разные пакеты, как в вашем случае. Я не знаю, какой из них можно использовать, если вы это сделаете. – Henry

+0

Хорошо, удалены, но такие же ошибки ... Спасибо. –