Spring: PropertyPlaceholderConfigurer не может найти файл свойств - PullRequest
3 голосов
/ 25 августа 2011

У меня странная проблема с Spring при использовании PropertyPlaceholderConfigurer.Один из моих бинов имеет следующий вид:

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

Проблема в том, что spring никогда не находит jdbc.properties (FileNotFoundException).Файл находится в папке с именем «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 своего собственного пакета, который используется моим пакетом.Знаете ли вы, как решить эту сложную проблему?

Спасибо,

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

попробуй classpath*:jdbc.properties

1 голос
/ 25 августа 2011

Разработчик IANA OSGI, но быстрый поиск в Google приводит к ссылке на документацию Spring-osgi.Посмотрите на раздел 5.4 и обратите внимание, что пакет spring-osgi вносит некоторые изменения в загрузку Resource.Похоже, что ResourceLoader, реализованный по умолчанию ApplicationContext для osgi, автоматически будет предварительно ожидать osgibundle:, если не указан другой префикс.

Похоже, что между путями есть некоторая разница в области видимостиискал при использовании classpath: и путь, использованный при использовании classpath*:, но я до сих пор не смог найти хорошее объяснение этому.

...