我正在将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无法启动。
我已经有一段时间了。任何建议都非常感谢。
答案 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?