Spring没有注入ServletContext

时间:2012-03-09 15:49:34

标签: spring-mvc

我正在使用Spring 3.0.7,出于某些原因,在我们的JBOSS Web应用程序中,我们无法将ServletContext放入我们的bean中:

@Component("assembler")
public class DefaultAssemblerStrategy implements AssemblerStrategy//, ServletContextAware
{

   @Autowired//(required=false)
   private ServletContext servletCtxt;

   public void setServletContext(ServletContext servletContext)
   {
      System.out.println("~~~~~~~~~~~~setServletContext");
      servletCtxt = servletContext;
   }

请注意,这是在实际的Web服务器上,而不是在JUnit测试用例运行期间。

如果我尝试使用Autowired,我会收到此错误:

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'assembler': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private javax.servlet.ServletContext com.ibm.retail.xc.maestro.web.theme.impl.DefaultAssemblerStrategy.servletCtxt; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [javax.servlet.ServletContext] 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)}
            at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1073)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:516)
            at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:455)

如果我实现ServletContextAware,它只是空...

2 个答案:

答案 0 :(得分:1)

听起来你并没有使用ContextLoaderListenerServletContextAware依赖BeanFactoryPostProcessorAbstractRefreshableWebApplicationContextrefresh()设置的ContextLoader。上下文依赖于ServletContextContextLoaderListener注入其中。因此,您可以在应用程序中使用AbstractRefreshableWebApplicationContext#setServletContext()来解决此问题,或者(可能更简单地)在刷新上下文之前调用ServletContext

定义{{1}} bean也可能有效,但从概念上讲,servlet上下文是"在"之外" Spring上下文 - 实际上它是管理Spring上下文的servlet上下文,反之亦然。令人高兴的是,这种做法完全没必要。

答案 1 :(得分:0)

madth3表明了一个可能的原因:即使用名称applicationContext定义bean。这很有道理,例如用于使用MockApplicationContext进行测试,但不在应用程序本身中进行测试。