WebApplicationContext似乎忽略导入注释

时间:2013-12-06 17:43:26

标签: spring tomcat7 spring-annotations servlet-listeners

我遇到一个问题,即Spring WebApplicationContext似乎忽略了我的网络应用程序中@Infiguration-annotated配置类的@Import注释。它不是Spring MVC网络应用程序。

在处理自定义ServletContextListener的contextInitialized事件期间出现问题,该事件曾经能够在我使用XML配置时成功检索此bean,但现在我现在没有找到这个bean(显然不正确)转换为使用@Configuration-annotated classes。

我看到的症状是:

  • 在应用启动期间,我看到了Spring框架的输出:
  

信息:没有为指定的类/包找到带注释的类   [org.imaginary.spring.config.Instrumented]

  • 后来,当调用我的contextInitialized()方法并调用getBean()时,我得到一个NoSuchBeanDefinition异常

我的配置类是以这样一种方式考虑的,例如,我有两个高级配置类,一个用于“生产”配置,另一个用于“检测”配置。这些顶级配置类本身是完全空的,但它们使用@Import注释(我希望)为这种配置引入相关的bean定义。

例如,这是Instrumented配置类:

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>

我错过了哪些想法?

1 个答案:

答案 0 :(得分:4)

在这种情况下,Spring配置类或配置没有任何问题。问题实际上是构建问题 - 配置类已添加到未包含在主Web应用程序jar中的包中,因此类文件不存在。我很惊讶没有抛出NoClassDefFoundError异常,因为这个错误留下了该类存在的印象,它只是没有注释:

  

找不到指定类/包的带注释类   [your.class.here]。