Jan
Jan

Reputation: 2833

spring DispatcherServlet context inheritance

Typically there is one ApplicationContext (parent) and 0..n DispatcherServlets (children). Is it also possible to have aDispatcherServlet that has another DispatcherServlet as parent context which has the ApplicationContext as parent? As I understood, beans can be resolved transitively so it should be possible to access the application context.

I don't want to put the shared beans into the ApplicationContext because they must not be exposed to other DispatcherServlet - with one exception.

Upvotes: 3

Views: 1947

Answers (2)

Jan
Jan

Reputation: 2833

I extended the DispatcherServlet. Now it works perfectly!

public class ConfigurableDispatcherServlet extends DispatcherServlet {

    private String contextParent;

    /**
     * Initialize and publish the WebApplicationContext for this servlet.
     * <p>
     * Delegates to {@link #createWebApplicationContext} for actual creation of
     * the context. Can be overridden in subclasses.
     * 
     * @return the WebApplicationContext instance
     * @see #setContextClass
     * @see #setContextConfigLocation
     */
    protected WebApplicationContext initWebApplicationContext() {
        // No fixed context defined for this servlet - create a local one.
        WebApplicationContext parent = WebApplicationContextUtils.getWebApplicationContext(getServletContext(),
                "org.springframework.web.servlet.FrameworkServlet.CONTEXT." + getContextParent());
        WebApplicationContext wac = createWebApplicationContext(parent);

        // Publish the context as a servlet context attribute.
        String attrName = getServletContextAttributeName();
        getServletContext().setAttribute(attrName, wac);
        if (this.logger.isDebugEnabled()) {
            this.logger.debug("Published WebApplicationContext of servlet '" + getServletName() +
                        "' as ServletContext attribute with name [" + attrName + "]");
        }
        if(this.logger.isInfoEnabled()) {
            this.logger.info(getServletName() + " is a child of " + parent.getDisplayName());
        }

        return wac;
    }

    public String getContextParent() {
        return contextParent;
    }

    public void setContextParent(String contextParent) {
        this.contextParent = contextParent;
    }
}

Upvotes: 1

axtavt
axtavt

Reputation: 242686

From HttpServletBean and FrameworkServlet it looks like you can do the following to make bar use context of foo as its own:

<servlet>
    <servlet-name>foo</servlet-name>
    <servlet-class>...DispatcherServlet</servlet-class>
</servlet>

<servlet>
    <servlet-name>bar</servlet-name>
    <servlet-class>...DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextAttribute</param-name>
        <param-value>foo-servlet</param-value>
    </init-param>
</servlet>

Upvotes: 1

Related Questions