2012-02-08 46 views
0

我們有一個Web應用程序,它使用Spring(3.0.5)和CXF(當前2.4.2由於各種原因,但升級是一個選項,如果有什麼區別)並且部署在Tomcat上。如何在使用CXF時刷新Spring上下文?

該應用程序使用org.springframework.web.context.ContextLoaderListener進行初始化。

啓動和關閉應用程序下來就像一個魅力的作品,但如果我嘗試刷新Spring應用程序上下文,使用

((ConfigurableApplicationContext)applicationContext).refresh();

我遇到的問題。應用程序上下文首先銷燬它的所有bean(包括CXFBusImpl,或者更確切地說它的子類SpringBus)。然而SpringBus在其應用程序上下文調用close() - 導致一個NullPointerException當應用程序上下文不久後試圖關閉它的bean工廠:

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一切正常。

+0

你爲什麼刷新上下文? – 2012-02-08 16:12:13

+0

我有一個非常複雜的應用程序,有時需要在配置更改後重新配置(不重新啓動Tomcat)。除CXF問題外,它還可以工作。 – 2012-02-08 16:29:10

回答

0

我不認爲你可以告訴CXF不要這樣工作。你可以做的是將應用程序中需要重新啓動的部分分離到你自己構建的上下文中,並按照你的選擇將其拆除,而不涉及主要上下文。也許你會用ClassPathXmlApplicationContext這樣做,儘管有幾個選擇。我認爲你會被設置在外上下文內的父母,並參考外豆XML-config syntax,如:

<ref parent="foo" /> 

然後您就需要創建CXF進行代理活動的一些方法在內部環境中的外部環境中。這是一個棘手的部分,因爲它通常被認爲是引用這種方式的糟糕形式。作爲其創建/初始化過程的一部分(並在拆除時註銷),您可能必須在外部上下文中有(某些)內部bean連接到的註冊表/代理。您還必須決定如何處理在沒有內部上下文時需要提供請求的情況。整蠱,特別是如果你想優雅地做...

+0

是的,類似的東西可能會起作用。我昨天看了一下,但對於那些應該「正常工作」的東西(假設我的bean可以正確初始化和銷燬​​)似乎很奇怪。我想我將把它作爲CXF上的一個錯誤提交。 – 2012-02-09 07:52:38

+0

我剛剛在此提交了一個錯誤:https://issues.apache.org/jira/browse/CXF-4094 – 2012-02-09 10:02:30

+0

CXF-4094已在CXF 2.4.7和2.5.3中解決。但是,爲了使其全面運行,CXFServlet也需要自行刷新。我已經提交了一個錯誤(https://issues.apache.org/jira/browse/CXF-4127),但可以很容易地創建一個自定義的子類,直到它解決。 – 2012-02-27 15:16:49

相關問題