【问题标题】:How to refresh the Spring context when using CXF?使用 CXF 时如何刷新 Spring 上下文?
【发布时间】: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 问题之外,它还有效。

标签: spring cxf


【解决方案1】:

我认为你不能告诉 CXF 不要那样工作。但是,您可以做的是将需要重新启动的应用程序部分隔离到您自己的上下文中,您可以根据自己的选择构建和拆除这些上下文,而无需过多地涉及主上下文。也许你会用ClassPathXmlApplicationContext 来做到这一点,尽管有几个选择。我认为您会将外部上下文设置为内部上下文的父级,并使用 XML-config syntax 引用外部 bean,例如:

<ref parent="foo" />

然后,您需要创建某种方式,将外部上下文中的 CXF 活动代理到内部上下文中的 bean。这是棘手的部分,因为它通常被认为是不好的引用形式。您可能必须在外部上下文中拥有某种注册表/代理,(相关)内部 bean 作为其创建/初始化过程的一部分连接到(并在拆卸时取消注册)。您还必须决定如何处理在没有内部上下文时需要处理请求的情况。棘手,特别是如果你想优雅地做到这一点......

【讨论】:

  • 是的,这样的事情可能会奏效。我昨天看过它,但对于应该“正常工作”的东西来说似乎很奇怪(假设我的 bean 可以正确初始化和销毁​​)。我想我会将此作为 CXF 上的错误提交。
  • CXF-4094 在 CXF 2.4.7 和 2.5.3 中得到解决。然而,为了使其充分发挥作用,CXFServlet 也需要刷新自身。我已经为此提交了一个错误 (issues.apache.org/jira/browse/CXF-4127),但是可以轻松地创建一个自定义子类,直到它得到解决。
猜你喜欢
  • 2011-12-28
  • 1970-01-01
  • 2023-03-28
  • 2023-04-01
  • 2019-01-03
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
相关资源
最近更新 更多