【发布时间】:2012-02-08 15:40:25
【问题描述】:
我们有一个使用 Spring (3.0.5) 和 CXF(由于各种原因目前是 2.4.2,但如果有任何不同,可以选择升级)并部署在 Tomcat 上的 Web 应用程序。
使用org.springframework.web.context.ContextLoaderListener初始化应用程序。
启动和关闭应用程序就像一个魅力,但如果我尝试刷新 Spring 应用程序上下文,使用
((ConfigurableApplicationContext)applicationContext).refresh();
我遇到了问题。应用程序上下文首先销毁它的所有bean(包括CXFBusImpl,或者更确切地说是它的子类SpringBus)。然而,SpringBus 在其应用程序上下文上调用 close() - 当应用程序上下文在尝试关闭其 bean 工厂后不久导致 NullPointerException:
java.lang.NullPointerException
at org.springframework.context.support.AbstractRefreshableApplicationContext.closeBeanFactory(AbstractRefreshableApplicationContext.java:152)
at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:124)
at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:467)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:397)
我能做些什么来避免这种情况(除了修改 CXF)吗?如果我跳过 CXF,一切正常。
【问题讨论】:
-
为什么要刷新上下文?
-
我有一个相当复杂的应用程序,有时需要在配置更改后重新配置(无需重新启动 Tomcat)。除了 CXF 问题之外,它还有效。