繁体   English   中英

Spring应用程序上下文重新加载不会更新DelegatingFilterProxy注册的bean

[英]Spring application context reloading doesn't update bean registered by DelegatingFilterProxy

在应用程序中,我们具有即时更新配置的功能。 它会覆盖应用程序属性并调用:

  ((ConfigurableApplicationContext)applicationContext).refresh();

我们还使用DelegatingFilterProxy将Spring bean注册为过滤器。

@Override
protected Filter[] getServletFilters() {
    DelegatingFilterProxy delegatingFilterProxy = new DelegatingFilterProxy("myFilter");
    delegatingFilterProxy.setContextAttribute(FrameworkServlet.SERVLET_CONTEXT_PREFIX + "dispatcher");

    return new Filter[] { delegatingFilterProxy };
}

当我重新加载application.properties时,我看到Spring重新创建所有bean,但DelegatingFilterProxy仍然使用第一个版本的过滤器bean(因此所有请求都被过时的过滤器过滤掉过时的autowired bean)

你知道为什么会发生这种情况吗?

我可以告诉你为什么会这样。

我假设您在WebApplicationInitializer子类中注册DelegatingFilterProxy ,可能是AbstractDispatcherServletInitializer子类。

无论如何,这个类完全独立于ApplicationContext的动作。 Servlet容器扫描您的类路径并找到Spring的SpringServletContainerInitializer ,它找到您的WebApplicationInitializer实现并运行它。 然后注册DelegatingFilterProxy指定bean名称。

当第一个请求进入您的服务器时, DelegatingFilterProxy将尝试在ApplicationContext查找其委托并将其设置为其委托字段。 它仅在其当前委托为null 因此刷新上下文不会影响它。

有可能的解决方案在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM