2012-03-09 99 views
4
我使用Spring 3.0.7

,由于某种原因在我们的JBOSS Web应用程序,我们无法得到ServletContext进入我们的bean:春不注入的ServletContext

@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它只是空...

+1

如何以及在哪里配置了应用程序上下文? – skaffman 2012-03-09 15:51:37

+0

我们有一个自定义的dispatcherservlet,并且正常在web.xml中。我已经能够自动装载ApplicationContext,而不是ServletConfig。 – arinte 2012-03-09 16:11:19

+0

嗯,这个错误对我来说很有意义,除非你在Spring配置中有一个定义为bean的'ServletContext'。现在,'ServletContextAware'应该可以工作,但它依赖于正确的配置。 – madth3 2012-03-09 16:13:38

回答

0

这听起来像你不使用ContextLoaderListenerServletContextAware依赖于AbstractRefreshableWebApplicationContextrefresh()内部设置的BeanFactoryPostProcessor。上下文依赖ContextLoaderServletContext注入其中。因此,您可以在应用程序中使用ContextLoaderListener来解决此问题,或者(可能更简单地)在刷新上下文之前调用AbstractRefreshableWebApplicationContext#setServletContext()来解决此问题。

定义一个ServletContext bean也可能起作用,但从概念上讲,servlet上下文在Spring上下文之外 - 实际上是管理Spring上下文的servlet上下文,反之亦然。令人高兴的是,这种方法完全没有必要。

+0

我不认为这是真的。无论是否启用'ContextLoaderListener',Spring的基础架构都可以使用'ServletContext'。 – skaffman 2012-05-06 09:16:23

0

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