Весной не залить ServletContext - PullRequest
4 голосов
/ 09 марта 2012

Я использую Spring 3.0.7 и по какой-то причине в нашем веб-приложении JBOSS мы не можем получить 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;
   }

Обратите внимание, что это на реальном веб-сервере, а не во время выполнения теста 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 ]

1 голос
/ 06 мая 2012

Похоже, вы не используете ContextLoaderListener.ServletContextAware полагается на BeanFactoryPostProcessor, который установлен AbstractRefreshableWebApplicationContext внутри refresh().Контекст полагается на ContextLoader, чтобы вставить ServletContext в него.Поэтому вы можете решить эту проблему, используя ContextLoaderListener в своем приложении или (возможно, более просто), вызывая AbstractRefreshableWebApplicationContext#setServletContext() до обновления контекста.

Определение компонента ServletContext также может работать, но концептуальноконтекст сервлета находится вне контекста Spring - на самом деле контекст сервлета управляет контекстом Spring, а не наоборот.К счастью, такой подход совершенно не нужен.

0 голосов
/ 27 июня 2012

madth3 указал возможную причину, а именно, что бин определен с именем applicationContext. Это имеет смысл, например, для тестирования с MockApplicationContext, но не в самом приложении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...