2011-08-25 74 views
3

我對Spring使用PropertyPlaceholderConfigurer有一個奇怪的問題。我的一個豆的設計如下:Spring:PropertyPlaceholderConfigurer找不到屬性文件

<bean name="propertyPlaceholder" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
     <value>classpath:jdbc.properties</value> 
    </property> 
</bean> 

的問題是,春天永遠找不到jdbc.properties(FileNotFoundException)。該文件位於bundle classpath中的一個名爲「resources」的文件夾中(我正在使用OSGi項目)。我嘗試了幾乎所有的組合(「jdbc.properties」,「/jdbc.properties」,「classpath:jdbc.properties」,「classpath:/jdbc.properties」,「/resources/jdbc.properties」,以及其他所有組合的組合。等等......)但它從來沒有工作。

的信息,如果在某些時候,我做這樣的事情:

URL u = someClassLoader.getResource("jdbc.properties"); 

它的工作沒有任何問題,並找到該文件。其實我完全無法理解春天的錯誤。

如果您有任何想法來幫助我,請提前致謝。春天我不是很有經驗,所以我可能在某個地方犯了一個錯誤。

[編輯]

事實上,它的類加載器的問題: 如果我做的:

new ClassPathResource("jdbc.properties"); 

這是行不通的。但是:

new ClassPathResource("jdbc.properties",someClassIntheBundle.class.getClassLoader()); 

完美的作品。

我確實認爲Spring使用自己捆綁包的ClassLoader被我的捆綁包使用。你知道解決這個棘手問題的方法嗎?

感謝,

+0

目前,我必須在我的配置文件中加入可怕的靜態路徑進行測試(如bundleresource://63.jhdjlzeo:2/jdbc.properties(它適用於它))。我還沒有找到任何其他解決方案(參見其他評論infra) – ThR37

回答

2

嘗試classpath*:jdbc.properties

+0

令人印象深刻,它的工作原理!非常感謝你的幫助 ! – ThR37

+0

實際上,它不再抱怨,但它也沒有找到位置:感謝所有情況下的幫助。你知道與classpath的主要區別是什麼:? – ThR37

+0

很抱歉,很長的答案。你可以在spring [參考]中找到它(http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/resources.html)。當然,您可以使用'MyConfigurer.class.getResourceAsStream()'創建PropertyPlaceholderConfigurer的子類並加載prop文件。 –

1

IANA OSGI開發,但在link到春節OSGi的文檔快速谷歌搜索結果。看看5.4節,注意到spring-osgi包對Resource加載進行了一些修改。它看起來像ResourceLoader實施的默認ApplicationContext爲osgi將自動預先掛起osgibundle:如果沒有提供其他前綴。

看起來好像在使用classpath:時搜索到的路徑與使用classpath*:時使用的路徑之間存在一定差異,但至今我一直無法找到一個好的解釋。

+0

感謝您的鏈接。我可能錯過了它。在所有情況下,我都需要調查一些「奇怪」的東西(使用classpath * :,它確實找到了屬性文件,但它仍然無法解析佔位符,它可能根本不能鏈接,但我不確定.. 。 – ThR37

+0

@ ThR37:我目前無法找到它的文檔,但我似乎記得,當在父ApplicationContext中的PropertyPlaceholderConfigurer中加載的屬性被引用時,屬性標記解析中存在缺陷。導入''ApplicationContext'。 –