Переменная среды переопределяется аннотацией Spring Value

Я установил свойство переменной среды оракула в файле свойств следующим образом:

oracle.home=XXX
file.path=C:\workspace

Я использую аннотацию spring factory bean и объявляю oracle Home в классе следующим образом:

@Value("${oracle.home}") private String oracleHome; //becomes YYY

Все остальные мои свойства считываются правильно, но oracleHome переопределяется тем, что я установил в своей среде (например, ORACLE_HOME), и не считывается из файла свойств.

Почему это происходит и как я могу это решить?


person M06H    schedule 14.11.2016    source источник
comment
Я не понимаю. У вас есть файл свойств, загруженный с помощью oracle.home, а также системное свойство с именем oracle.home?   -  person Sotirios Delimanolis    schedule 14.11.2016
comment
приложение читает в системной оболочке ORACLE_HOME вместо того, что я установил в файле свойств. У меня есть две версии oracle home.   -  person M06H    schedule 14.11.2016
comment
Я не знаю, как ORACLE_HOME переводится как oracle.home. Spring может иметь несколько источников свойств. Эти заказаны. Я считаю, что системные свойства и свойства среды упорядочены в первую очередь. Ваши пользовательские .properties файлы упорядочены после этого. Должен быть способ быть явным в заказе.   -  person Sotirios Delimanolis    schedule 14.11.2016
comment
как настроен ваш заполнитель свойства?   -  person kuhajeyan    schedule 15.11.2016


Ответы (2)


Переменные среды ОС рассматриваются в более высоком порядке, чем файл .properties. Большинство операционных систем запрещают имена ключей, разделенные точками, поэтому Spring автоматически сопоставляет ваше имя собственности с ORACLE_HOME на oracle.home. Вы можете прочитать больше здесь:

Свойства, учитывающие порядок

person Piotr Sołtysiak    schedule 14.11.2016

Вы можете контролировать свой заполнитель свойства, чтобы никогда не проверять системные свойства и переопределять ключ/значение, которое у вас есть в файле свойств.

доступно 3 значения

  • SYSTEM_PROPERTIES_MODE_FALLBACK — проверьте системные свойства, если они не разрешаются в указанных свойствах.
  • SYSTEM_PROPERTIES_MODE_NEVER — никогда не проверять системные свойства.
  • SYSTEM_PROPERTIES_MODE_OVERRIDE — сначала проверьте системные свойства, прежде чем пытаться использовать указанные свойства.

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.html

<context:property-placeholder location="classpath:foo.properties">
<property name="systemPropertiesModeName">
    <value>SYSTEM_PROPERTIES_MODE_NEVER</value>
</property>
</context>

or

       @Bean
       public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
          PropertySourcesPlaceholderConfigurer p = new PropertySourcesPlaceholderConfigurer();
          p.setLocation("..")
          p.setSystemPropertiesMode(SYSTEM_PROPERTIES_MODE_NEVER);
          return p;
       }
person kuhajeyan    schedule 15.11.2016