spring-mvc - Spring不注入(inject)ServletContext

标签 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:创建名为“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依赖于 BeanFactoryPostProcessorAbstractRefreshableWebApplicationContext 设置里面 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/

相关文章:

java - 文件对话框中可接受的扩展名

java - 异常解析器和调度器不转发

java - SPNEGO 身份验证失败的自定义错误页面

hibernate - JavaTypeDescriptorRegistry - 找不到所请求的 Java 类的匹配类型描述符

java - 如何在单击链接时将java对象从jsp传递到spring Controller

spring-mvc - 如何在 Spring MVC 中从数据库加载主题?

spring - 使用 Spring Boot 拦截器重定向

java - A <形式:errors> block that only shows non-field errors?

java - DispatcherServlet 中的 ThreadLocal

java - Spring REST 验证并非所有方法