Spring Framework 5.0.0.final parent 上下文未加载



我正在尝试使用最新的春季 5.0.0.Final 与我的 EAR 项目一起使用,该项目在 web 中定义了父上下文.xml使用上下文参数 使用参数名称 locatorFactorySelectorparentContextKey,但 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。这是我所做的:

  1. 手动重新引入 BeanFactory定位器机制。从 Spring 4 开始学习以下课程,将其放入代码和修复包中:
AbstractUrlMethodNameResolver
AnnotationMethodHandlerAdapter
BeanFactoryLocator
BeanFactoryReference
BootstrapException
ContextSingletonBeanFactoryLocator
DefaultAnnotationHandlerMapping
HandlerMethodInvocationException
HandlerMethodInvoker
HandlerMethodResolver
InternalPathMethodNameResolver
MethodNameResolver
NoSuchRequestHandlingMethodException
ServletAnnotationMappingUtils
SingletonBeanFactoryLocator
SourceHttpMessageConverter
WebUtils
XmlAwareFormHttpMessageConverter
  1. 按照Subhranil在这个线程中的建议,使用自定义的ContextLoaderListener,它加载的父上下文与Spring 4中的上下文相同。然后在网络.xml中使用它。
  2. 在每个 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 中可能有更好的方法来解决父上下文加载问题,我仍然需要弄清楚。

相关内容

  • 没有找到相关文章

最新更新