【问题标题】:Environment Variable is overriden with Spring Value annotation环境变量被 Spring Value 注释覆盖
【发布时间】:2016-11-14 18:31:52
【问题描述】:

我在属性文件中设置我的 oracle 环境变量属性如下:

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

我使用的是spring factory bean注解,我在一个类中声明oracle Home如下:

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

我的所有其他属性都已正确读入,但oracleHome 被我在环境中设置的内容(例如 ORACLE_HOME)覆盖,而不是从属性文件中读入..

为什么会发生这种情况,我该如何解决?

【问题讨论】:

  • 我不明白。您有一个使用oracle.home 加载的属性文件,并且您还有一个名为oracle.home 的系统属性?
  • 应用程序读取 ORACLE_HOME 系统环境,而不是我在属性文件中设置的内容。我有两个版本的 oracle home。
  • 我不知道ORACLE_HOME 如何转换为oracle.home。 Spring 可以有多个属性源。这些是有序的。我相信系统属性和环境属性是首先排序的。您的自定义 .properties 文件在此之后排序。应该有一种明确的顺序。
  • 你的属性占位符是如何配置的?

标签: java spring spring-bean


【解决方案1】:

操作系统环境变量的考虑顺序高于 .properties 文件。 大多数操作系统不允许使用句点分隔的键名,因此 spring 会自动将您的属性名称从 ORACLE_HOME 映射到 oracle.home。你可以在这里阅读更多:

Properties considering order

【讨论】:

    【解决方案2】:

    您可以控制您的属性占位符从不检查系统属性并使用属性文件中的键/值覆盖。

    有 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>
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 2022-01-12
      • 2020-03-15
      相关资源
      最近更新 更多