phoenix phoenix - 1 month ago 21
Java Question

How to set ServletContext property for a bean in Spring XML metadata configuration

I tried searching here on SO but i couldn't find a solution. I have some XML metadata like the following.

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

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


With this configuration I am getting an exception saying that
"javax.servlet.ServletContext"
is an interface and it couldn't create a bean with the id
servletContext
. The ProductController class is in some jar which I can't modify but I want it as a bean in my application. It has ServletContext property autowired.

Answer

If you need to create a bean for ServletContext in a XML config spring application, you could use a BeanFactory<ServletContext> implementing 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;
    }

}

You can then declare :

<bean class="org.app.ServletContextFactory" id="servletContext" />

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