2016-11-14 19 views
1

设置我的Oracle环境变量属性在属性文件,如下所示:环境变量进行重写同春价值诠释

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

我使用弹簧厂豆注释和我宣布Oracle主作为一类如下:

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

我所有的其他财产被正确读取,但oracleHome被重写与我在我的环境(如ORACLE_HOME)已设置,而不是从属性文件中读取..

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

+0

我不明白。你有一个用'oracle.home'加载的属性文件,你也有一个名为'oracle.home'的系统属性? –

+0

应用程序读取ORACLE_HOME系统env而不是我在属性文件中设置的内容。我有两个版本的oracle主页。 – user2781389

+0

我不知道'ORACLE_HOME'如何转换为'oracle.home'。 Spring可以有多个属性来源。这些都是有序的。我相信系统属性和环境属性是首先排序的。您的自定义'.properties'文件在此之后进行排序。应该有一种方法可以在命令中明确。 –

回答

1

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

Properties considering order

1

你可以控制你的财产占位符永不检查系统属性和与键/值必须在属性文件覆盖。

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