2013-12-06 2 views
0

У меня возникла проблема, когда Spring WebApplicationContext игнорирует аннотацию @Import в @ config-annotated config class в моем веб-приложении. Это не веб-приложение Spring MVC.WebApplicationContext игнорируется Импорт аннотации

Проблема возникает во время обработки contextInitialized события пользовательского ServletContextListener, который раньше имел возможность успешно извлекать этот компонент, когда я использовал конфигурацию XML, но теперь не нахожу этот bean-компонент теперь, когда я (по-видимому, неправильно) преобразован для использования @ -конфигурированных аннотированных классов.

Симптомов я вижу, являются:

  • Во время запуска приложения, я вижу этот выход из рамок Spring:

INFO: Нет аннотированные классы, найденные для указанного класса/пакета [ org.imaginary.spring.config.Instrumented]

  • Позже, когда мой метод contextInitialized() вызывается, и я называю getBean(), я получить исключение NoSuchBeanDefinition

Мои классы конфигурации сфакторизованы таким образом, что у меня есть, например, два на высоком уровне конфигурации классы, один для конфигурации «Производство», другой - для «Instrumented». Эти классы конфигурации верхнего уровня сами по себе совершенно пустые, но они используют аннотацию @Import для (я надеюсь) привнести соответствующие определения bean для такой конфигурации.

Например, вот инструментальный класс конфигурации:

package org.imaginary.spring.config; 

import org.imaginary.spring.config.instrumentation.InstrumentationDependencies; 
import org.imaginary.spring.config.servlets.ServletDependencies; 

@Configuration 
@Import({InstrumentationDependencies.class, ServletDependencies.class }) 
public class Instrumented 
{ 
} 

... для целей этого примера, вот конфиг класс InstrumentationDependencies, определенный в другом пакете:

package org.imaginary.spring.config.instrumentation; 

@Configuration 
public class InstrumentationDependencies 
{ 
    @Bean 
    public IEventSink eventSinkImpl() 
    { 
     return new InstrumentationEventSinkImpl(); 
    } 
} 

Здесь (урезанная версия) метод contextInitialized():

@Override 
public void contextInitialized(ServletContextEvent ctxEvent) 
{ 
    try 
    { 
     if (_publisher == null) 
     { 
      WebApplicationContext springContext = WebApplicationContextUtils.getWebApplicationContext(ctxEvent.getServletContext()); 
      _eventSink = (IEventSink)springContext.getBean("eventSinkImpl");    
     } 

     _eventSink.startReceiving(); 
    } 
    catch (Exception e) 
    { 
     // handle exception 
    } 
} 

Вот некоторые данные из моего web.xml:

<context-param> 
    <param-name>contextClass</param-name> 
    <param-value> 
     org.springframework.web.context.support.AnnotationConfigWebApplicationContext 
    </param-value> 
</context-param> 

<context-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>org.imaginary.spring.config.Instrumented</param-value> 
</context-param> 

<listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<listener> 
     <listener-class>org.imaginary.MyContextListener</listener-class> 
</listener> 

Любые идеи, что я пропустил?

+0

Прежде всего, убедитесь, что имя вашего класса конфигурации действительно 'org.imaginary.spring.config.Instrumented'. – axtavt

+0

Спасибо, да, я это подтвердил.Класс называется Instrumented, и он определен в пакете 'org.imaginary.spring.config'. – Hoobajoob

+0

@axtavt: любые другие предложения? Это сводит меня с ума. Я могу настроить такую ​​конфигурацию для работы в обычном старом приложении, где я управляю созданием контекста, но я не могу заставить это работать в настройке веб-приложения. Это кажется довольно простым, поэтому я должен упустить что-то очевидное. – Hoobajoob

ответ

4

В этом случае нет ничего плохого в классах конфигурации или конфигурации Spring. Проблема была на самом деле проблемой сборки - классы конфигурации были добавлены в пакет, который не включался в главный баннер веб-приложений, поэтому файлы классов не присутствовали. Я был удивлен тем, что не было исключением NoClassDefFoundError выброшен, так как эта ошибка оставляет впечатление, что класс существует, он просто не аннотированные:

Нет аннотированных классов, найденных для указанного класса/пакета [ваши. class.here].

Смежные вопросы