2013-03-30 3 views
1

Я пытаюсь отделить файлы конфигурации приложения от его войны. Я хочу сохранить все файлы свойств в каталоге на диске. Тогда единственное имущество, необходимое внутри войны будет путь к директории конфигурации (скажем, что будет находиться в файле с именем config.properties):Как использовать имя файла переменной в Spring?

config.dir = /home/me/config 

Теперь в конфигурации родниковой, я хочу, чтобы загрузить этот файл (так что я знаю, где другие), а затем внешние файлы:

<bean id="propertySourcesPlaceholderConfigurer" 
class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>classpath:META-INF/config.properties</value> 
      <value>${config.dir}/other.properties</value> 
     </list> 
    </property> 
</bean> 

Но это не работает, заполнитель не решен:

java.io.FileNotFoundException: class path resource [${config.dir}/config.properties] cannot be opened because it does not exist 

Я также пробовал использовать отдельный компонент типа PropertySourcesPlaceholderConfigurer - это не помогло.

Вы знаете, как я мог это сделать?

ответ

2

Это можно решить, зарегистрировав PropertySource для среды по умолчанию. Один из способов, это можно сделать с помощью Java является конфигурация:

@Configuration 
@PropertySource("classpath:META-INF/config.properties") 
public class MyConfig { 

} 

При этом в месте заполнитель должен разрешится:

<bean id="propertySourcesPlaceholderConfigurer" 
class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>${config.dir}/other.properties</value> 
     </list> 
    </property> 
</bean> 
3

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

Вы могли бы вместо того, чтобы поставить путь к конфигурации директории в web.xml как context-param

<context-param> 
    <param-name>configDir</param-name> 
    <param-value>/home/me/config</param-value> 
</context-param> 

, а затем получить доступ к нему, как #{contextParameters.configDir} в вашей Спринг конфигурации

<bean id="propertySourcesPlaceholderConfigurer" 
class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> 
    <property name="locations"> 
     <list> 
      <value>#{contextParameters.configDir}/other.properties</value> 
     </list> 
    </property> 
</bean> 

Или вы можете быть в состоянии сделать он с двумя отдельными фасолью конфигурации с различными значениями placeholderPrefix, один загружает config.properties, а затем заполняет заполнитель в другом месте, который затем загружает внешний файл конфигурации.