我正在尝试使用最新的春季 5.0.0.Final 与我的 EAR 项目一起使用,该项目在 web 中定义了父上下文.xml使用上下文参数 使用参数名称 locatorFactorySelector 和 parentContextKey,但 spring 无法加载父上下文。当我检查 ContextLoaderListener 源代码时,似乎没有应用逻辑来选择父上下文。在这里,我的问题是 spring 5 是否提供了 ContextLoader 的任何默认实现,以满足父上下文的加载或 spring 5 的丢弃,如果不是支持它的方法是什么,我必须实现我们自己的吗?
基于 locatorFactorySelector 的父上下文的加载在 ContextLoader#loadParentContext() 中处理。但是他们在此提交中将其更改为返回 null。
正如javadoc所说,我认为您可以创建一个新的ContextLoaderListener并覆盖此方法以返回父上下文:
public class FooContextLoaderListener extends ContextLoaderListener{
@Override
protected ApplicationContext loadParentContext(ServletContext servletContext) {
//load and return the parent context ......
}
}
然后使用这个 ContextLoaderListener 来启动 Spring :
<listener>
<listener-class>org.foo.bar.FooContextLoaderListener</listener-class>
</listener>
对我来说,下面的这段代码工作正常。
public class BeanFactoryContextLoaderListener extends ContextLoaderListener {
private static Logger log = Logger.getLogger(BeanFactoryContextLoaderListener.class);
@Override
protected ApplicationContext loadParentContext(ServletContext servletContext) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beanRefFactory.xml");
return ctx;
}
}
显然,我也在 web.xml 中添加了一个侦听器。
我的团队最近遇到了同样的问题。我们想开始使用Webflux,它需要Spring 5。这是我所做的:
- 手动重新引入 BeanFactory定位器机制。从 Spring 4 开始学习以下课程,将其放入代码和修复包中:
AbstractUrlMethodNameResolver
AnnotationMethodHandlerAdapter
BeanFactoryLocator
BeanFactoryReference
BootstrapException
ContextSingletonBeanFactoryLocator
DefaultAnnotationHandlerMapping
HandlerMethodInvocationException
HandlerMethodInvoker
HandlerMethodResolver
InternalPathMethodNameResolver
MethodNameResolver
NoSuchRequestHandlingMethodException
ServletAnnotationMappingUtils
SingletonBeanFactoryLocator
SourceHttpMessageConverter
WebUtils
XmlAwareFormHttpMessageConverter
- 按照Subhranil在这个线程中的建议,使用自定义的ContextLoaderListener,它加载的父上下文与Spring 4中的上下文相同。然后在网络.xml中使用它。
- 在每个 WAR 的 spring-servlet 中.xml添加
DefaultAnnotationHandlerMapping
以便它扫描控制器。还需要像AnnotationMethodHandlerAdapter
这样的豆子。
它为我们工作。
如果您所需要的只是您正在寻找的任何 Spring 管理类中的上下文参数ServletContextAware
.
只需实现该类并重写其方法即可获取ServletContext
对象。稍后您还可以使用 ServletContext
对象获取上下文参数。
看看一个非常相似的问题。
显然,SPR-15154 删除了定位父上下文的机制(另请参阅相应的 Github 问题 spring-framework#19720)。
一种解决方法是扩展org.springframework.web.context.ContextLoaderListener
并重新实现此堆栈溢出答案中描述的loadParentContext
方法。
在 Spring 5.x 中可能有更好的方法来解决父上下文加载问题,我仍然需要弄清楚。