У меня возникла проблема, когда 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>
Любые идеи, что я пропустил?
Прежде всего, убедитесь, что имя вашего класса конфигурации действительно 'org.imaginary.spring.config.Instrumented'. – axtavt
Спасибо, да, я это подтвердил.Класс называется Instrumented, и он определен в пакете 'org.imaginary.spring.config'. – Hoobajoob
@axtavt: любые другие предложения? Это сводит меня с ума. Я могу настроить такую конфигурацию для работы в обычном старом приложении, где я управляю созданием контекста, но я не могу заставить это работать в настройке веб-приложения. Это кажется довольно простым, поэтому я должен упустить что-то очевидное. – Hoobajoob