我正在使用 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:创建名为“assembler”的bean时出错:注入(inject) Autowiring 依赖项失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException:无法 Autowiring 字段:私有(private) javax.servlet.ServletContext com.ibm.retail.xc.maestro.web.theme.impl.DefaultAssemblerStrategy.servletCtxt;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为 [javax.servlet.ServletContext] 的匹配 bean:预计至少有 1 个 bean 有资格作为此依赖项的 Autowiring 候选者。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true)}
在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)
在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1073)
在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:516)
在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:455)
如果我实现
ServletContextAware
它只是空...
最佳答案
听起来你没有使用 ContextLoaderListener
. ServletContextAware
依赖于 BeanFactoryPostProcessor
由 AbstractRefreshableWebApplicationContext
设置里面 refresh()
.上下文依赖于 ContextLoader
注入(inject)ServletContext
进去。因此,您可以使用 ContextLoaderListener
解决此问题。在您的应用程序中,或者(可能更简单)调用 AbstractRefreshableWebApplicationContext#setServletContext()
在刷新上下文之前。
定义 ServletContext
bean 也可以工作,但从概念上讲,servlet 上下文在 Spring 上下文“之外”——实际上是 servlet 上下文在管理 Spring 上下文,反之亦然。幸运的是,这种方法完全没有必要。
关于spring-mvc - Spring不注入(inject)ServletContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9636930/