我遇到一个问题,即Spring WebApplicationContext似乎忽略了我的网络应用程序中@Infiguration-annotated配置类的@Import注释。它不是Spring MVC网络应用程序。
在处理自定义ServletContextListener的contextInitialized事件期间出现问题,该事件曾经能够在我使用XML配置时成功检索此bean,但现在我现在没有找到这个bean(显然不正确)转换为使用@Configuration-annotated classes。
我看到的症状是:
信息:没有为指定的类/包找到带注释的类 [org.imaginary.spring.config.Instrumented]
我的配置类是以这样一种方式考虑的,例如,我有两个高级配置类,一个用于“生产”配置,另一个用于“检测”配置。这些顶级配置类本身是完全空的,但它们使用@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>
我错过了哪些想法?
答案 0 :(得分:4)
在这种情况下,Spring配置类或配置没有任何问题。问题实际上是构建问题 - 配置类已添加到未包含在主Web应用程序jar中的包中,因此类文件不存在。我很惊讶没有抛出NoClassDefFoundError异常,因为这个错误留下了该类存在的印象,它只是没有注释:
找不到指定类/包的带注释类 [your.class.here]。