2011-08-25 2 views
3

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

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

Проблема заключается в том, что весна никогда не найти jdbc.properties (FileNotFoundException). Файл находится в папке с именем «resources», которая находится в пути класса bundle (я работаю в проекте OSGi).

Я пробовал почти каждую комбинацию («jdbc.properties», «/jdbc.properties», «classpath: jdbc.properties», «classpath: /jdbc.properties», «/resources/jdbc.properties», и т. д.), но он никогда не работает.

Для получения дополнительной информации, если в какой-то момент я сделать что-то вроде:

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

это делает работу без каких-либо проблем и найти файл. На самом деле я совершенно не понимаю, что такое ошибка с весной.

Если у вас есть идеи, чтобы помочь мне, заранее. Я не очень опытный весной, поэтому я, возможно, где-то ошибся.

[EDIT]

На самом деле, это проблема загрузчиком классов: Если я:

new ClassPathResource("jdbc.properties"); 

он не работает. Но:

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

работает отлично.

Я верю, что Spring использует ClassLoader своего собственного пакета, который потребляется моим пакетом. Знаете ли вы способ решить эту сложную проблему?

Спасибо,

+0

На данный момент я должен положить ужасный статический путь в свой конфигурационный файл для тестирования (например, bundleresource: //63.jhdjlzeo: 2/jdbc.properties (он работает с ним)). Я не нашел другого решения (см. Другие комментарии ниже) – ThR37

ответ

2

попробовать classpath*:jdbc.properties

+0

Впечатляет, он работает! Большое спасибо за вашу помощь ! – ThR37

+0

На самом деле, он больше не жалуется, но он также не находит свое местоположение: s Спасибо за все случаи вашей помощи. Вы знаете, в чем основное отличие от classpath:? – ThR37

+0

Извините за длинный ответ. Вы можете найти его весной [ссылки] (http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/resources.html). И, конечно же, вы можете создать подкласс класса PropertyPlaceholderConfigurer и загрузить файлы поддержки с помощью 'MyConfigurer.class.getResourceAsStream()'. –

1

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

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

+0

Спасибо за ссылку. Вероятно, я пропустил это. Есть несколько «странных» вещей, которые мне нужно исследовать во всех случаях (с помощью classpath * :, он находит файл свойств, но затем он все еще не может разрешить заполнители. Возможно, он не связан вообще, но я не уверен. – ThR37

+0

@ ThR37: Я не могу найти документацию для него в настоящее время, но, похоже, я помню, что был недостаток в разрешении токена свойства, когда свойства, загруженные в PropertyPlaceholderConfigurer в родительском «ApplicationContext», ссылались на ' import'ed 'ApplicationContext'. –

Смежные вопросы