【问题标题】:How to set ServletContext property for a bean in Spring XML metadata configuration如何在 Spring XML 元数据配置中为 bean 设置 ServletContext 属性
【发布时间】:2014-12-25 06:51:46
【问题描述】:

我尝试在 SO 上搜索,但找不到解决方案。我有一些 XML 元数据,如下所示。

<bean class="javax.servlet.ServletContext" id="servletContext" />

<bean class="com.abc.ProductController">
    <property name="servletContext" ref="servletContext"/>
</bean>

使用此配置,我收到一个异常,指出 "javax.servlet.ServletContext" 是一个接口,它无法创建 ID 为 servletContext 的 bean。 ProductController 类在一些我无法修改的 jar 中,但我希望它作为我的应用程序中的 bean。它具有自动装配的 ServletContext 属性。

【问题讨论】:

    标签: java xml spring spring-mvc


    【解决方案1】:

    如果您需要在 XML 配置 spring 应用程序中为 ServletContext 创建一个 bean,您可以使用实现 ServletContextAwareBeanFactory&lt;ServletContext&gt;

    public class ServletContextFactory implements FactoryBean<ServletContext>,
                ServletContextAware{
        private ServletContext servletContext;
    
        @Override
        public ServletContext getObject() throws Exception {
            return servletContext;
        }
    
        @Override
        public Class<?> getObjectType() {
            return ServletContext.class;
        }
    
        @Override
        public boolean isSingleton() {
            return true;
        }
    
        @Override
        public void setServletContext(ServletContext servletContext) {
            this.servletContext = servletContext;
        }
    
    }
    

    然后你可以声明:

    <bean class="org.app.ServletContextFactory" id="servletContext" />
    
    <bean class="com.abc.ProductController">
        <property name="servletContext" ref="servletContext"/>
    </bean>
    

    【讨论】:

      【解决方案2】:

      只需在控制器中自动装配上下文:

      @Autowired
      private ServletContext context;
      

      【讨论】:

      • 那你为什么要注入一些东西呢? ;)
      • 在这种情况下,它不会被扫描,也不会发生 DI。你能发布你的 xyz-servlet.xml 吗?
      • 我已经提到了xml。我拥有的罐子被混淆了。所以,这个注释可能是那个罐子里的任务。
      • 如果没有这个配置,其他 bean 和应用程序都可以正常工作
      • 如果属性有@Autowired 它不会被处理,请确保您已启用注释处理。 Spring 不会自动扫描注解。确保您有 &lt;context:annotation-config /&gt;&lt;context:component-scan /&gt; 以启用注释处理。
      【解决方案3】:

      您不能像这样在 XML 中引用 servlet 上下文,因为它的生命周期由 servlet 容器控制。

      解决方案是让com.abc.ProductController 实现ServletContextAware,然后Spring 会为您设置。

      【讨论】:

      • 那么你能不能在你的 webapp 中创建一个新的类来扩展ProductController(如果它不是最终的)并实现ServletContextAware?然后,您将通过setServletContext 方法处理ServletContext,并且根据超类方法的可见性可以将其设置为这种方式。诚然,有很多“如果”,但它可能会奏效!
      【解决方案4】:

      使用上面的 Serge Ballesta 创建的 ServletContextFactory 和 java 配置:

      @Configuration
      public class WebAppConfiguration {
      
          @Autowired
          private ServletContextFactory servletContextFactory;
      
          @Bean
          public ServletContextFactory servletContextFactory() {
               return new ServletContextFactory();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-12-07
        • 1970-01-01
        • 2017-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-02
        • 1970-01-01
        • 2012-08-28
        相关资源
        最近更新 更多