如何在Spring XML元数据配置中为bean设置ServletContext属性

时间:2014-10-29 14:10:34

标签: java xml spring spring-mvc

我尝试在这里搜索,但我无法找到解决方案。我有一些XML元数据,如下所示。

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

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

通过这种配置,我得到一个例外,说"javax.servlet.ServletContext"是一个接口,它无法创建一个标识为servletContext的bean。 ProductController类在某些jar中,我无法修改,但我希望它在我的应用程序中作为bean。它具有自动装配的ServletContext属性。

4 个答案:

答案 0 :(得分:8)

如果您需要在XML配置弹簧应用程序中为ServletContext创建一个bean,则可以使用BeanFactory<ServletContext>实现ServletContextAware

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>

答案 1 :(得分:0)

只需在控制器中自动连接上下文:

@Autowired
private ServletContext context;

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

使用java配置使用由Serge Ballesta创建的 ServletContextFactory ,并且:

@Configuration
public class WebAppConfiguration {

    @Autowired
    private ServletContextFactory servletContextFactory;

    @Bean
    public ServletContextFactory servletContextFactory() {
         return new ServletContextFactory();
    }
}