Как использовать свойство-placeholder для файла в файловой системе
У нас был способ загрузить свойства из файла в пути к классам:
<context:property-placeholder location="classpath:myConfigFile.properties" />
и он отлично работал. Но теперь мы хотим загрузить свойства из определенного файла в системе, которая НЕ находится в пути к классам. Мы хотели иметь возможность динамически загружать файл, поэтому мы используем переменную среды Java для ее заполнения. Я приведу простой пример ниже:
В Java:
System.setProperty("my.prop.file", "/path/to/myConfigFile.properties");
В Spring XML:
<context:property-placeholder location="${my.prop.file}" />
Я тоже пробовал это, благодаря идее Лучано:
<context:property-placeholder properties-ref="prop" />
<util:properties id="prop" location="reso"/>
<bean id="reso" class="org.springframework.core.io.FileSystemResource">
<constructor-arg index="0" value="${my.prop.file}" />
</bean>
Все, что я пробовал, провалилось. Независимо от того, для чего я установил my.prop.file. Наибольшие хиты включают в себя:
<context:property-placeholder location="/path/to/myConfigFile.properties" />
(ClassNotFoundException: .path.to.myConfigFile.properties)
<context:property-placeholder location="file:/path/to/myConfigFile.properties" />
(ClassNotFoundException: file:.path.to.myConfigFile.properties)
<context:property-placeholder location="file:///path/to/myConfigFile.properties" />
(ClassNotFoundException: file:...path.to.myConfigFile.properties)
Как вы используете хранилища свойств с местоположением, находящимся в файловой системе, и НЕ на пути к классам? Мы используем Spring 3.0.5.
Оказывается, была проблема с script запуском программы Java, загружающей файл Spring. Спасибо за помощь. Я попрошу удалить этот вопрос, поскольку исходный код работает в конце концов.
Благодарим вас за помощь.
Ответы
Ответ 1
Как насчет этого пути?
<context:property-placeholder properties-ref="prop" />
<util:properties id="prop" location="reso"/>
<bean id="reso" class="org.springframework.core.io.FileSystemResource">
<constructor-arg index="0" value="/yourpathandfile" />
</bean>
Ответ 2
Это работало для меня:
<context:property-placeholder location="file:/path/to/myConfigFile.properties" />
Но это (интересно) не делало:
<context:property-placeholder location="#{ systemProperties['foo'] }" />
Я получил
java.io.FileNotFoundException: Could not open ServletContext resource [/#{ systemProperties['foo'] }]
Вы не сможете использовать заполнитель свойств ${..}
с определением PropertyPlaceholderConfigurer. Это цыпленок перед яйцом.
Вы всегда можете подклассифицировать PropertyPlaceholderConfigurer и делать все, что хотите (например, вызвать setLocations()
в методе @PostConstruct
. Затем вместо использования <context:property-placeholder>
используйте:
<bean class="com.foo.MyPropertyPlaceholderConfigurer"/>