Spring 2到4:web-app上下文中缺少bean

时间:2014-12-01 11:26:34

标签: java spring web-applications servlet-filters applicationcontext

我正在将Spring版本从2.x升级到4.x,用于作为FileSystem Xml应用程序上下文运行的遗留应用程序,并使用来自父上下文的bean启动带有WebApplicon上下文的嵌入式jetty服务器。

在Spring 2中,这是通过覆盖createContextLoader()

的Custom ContextLoaderListener实现的。
public class CustomContextLoaderListener extends ContextLoaderListener implements ApplicationContextAware {

    private ApplicationContext parent;

    public void setApplicationContext(ApplicationContext ctx) throws BeansException {
        this.parent = ctx;
    }

    @Override
    protected ContextLoader createContextLoader() {
        return new ContextLoader() {
            @Override
            protected ApplicationContext loadParentContext(ServletContext servletContext)
                    throws BeansException {
                return parent;
            }
        };
    }

}

但是后来createContextLoader已经被删除,并且Spring 4被完全删除了。现在ContextLoaderListener扩展了ContextLoader本身。因此,我可以直接:

public class CustomContextLoaderListener extends ContextLoaderListener implements ApplicationContextAware {

    private ApplicationContext parent;

    public void setApplicationContext(ApplicationContext ctx) throws BeansException {
        this.parent = ctx;
    }

    @Override
    protected ApplicationContext loadParentContext(ServletContext servletContext)
            throws BeansException {
        return parent;
    }

}

通过这种方式,我能够在我的WebApplicationContext中启动bean,但现在当我的Tapestry过滤器调用Filter.init(...)时,只提供了Web应用程序bean。 ServletContext中缺少来自父FileSystem xml上下文的那些。对于所有过滤器(包括Tapestry 1),这只返回webapp bean:

public class SomeFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        ServletContext ctx = filterConfig.getServletContext();

        WebApplicationContext wctx = (WebApplicationContext) ctx.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

        for(String b : wctx.getBeanDefinitionNames()) {
            System.out.println("BEAN DEF : " + b);

        }

        /* FILTER OWN CODE */ 
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        /* FILTER OWN CODE */
    }

    @Override
    public void destroy() {
        /* FILTER OWN CODE */
    }
}

因此我的Tapestry webapp无法启动。

我已经有一段时间了。任何建议都非常感谢。

1 个答案:

答案 0 :(得分:0)

您应该能够通过在webapp上下文配置中将它们指定为导入来强制加载其他bean定义文件。

<import resource="classpath:my-other-config-1.xml" />
<import resource="file:/my-other-config-2.xml" />

http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/resources.html

How to import spring-config.xml of one project into spring-config.xml of another project?