2011-08-25 92 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'。 –