2012-03-09 107 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進行測試,但不在應用程序本身中進行測試。