2012-10-09 177 views
1

我一直假设东西,看到它现在不正确。我有以下的配置属性的声明在我的Spring上下文:从java类中的spring文件访问属性

<bean class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer"> 
     <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /> 
     <property name="searchContextAttributes" value="true" /> 
     <property name="contextOverride" value="true" /> 
     <property name="locations"> 
      <list> 
       <value>classpath:/app.properties</value> 
      </list> 
     </property> 
    </bean> 

我想从app.properties值将覆盖我的系统属性,这样我就可以直接访问它们在我的Java类是这样的:

String someThingFromPropertyFile = System.getProperty("nameFromPropertyFile"); 

当然,我得到空指针异常到处都是。现在我来问一下如何从你的应用程序访问你的应用程序属性(Java类是你的应用程序的一部分)。

有没有比这更好的方式(我不是说这是坏的)。

Access properties file programmatically with Spring?

+0

为什么不直接注入在你需要它,或者使用utils的财产? (我不确定为什么你会认为他们会覆盖系统属性 - 它们完全不相关。) –

回答

6

在应用方面:

<context:property-placeholder location="classpath:your.properties" ignore-unresolvable="true"/> 

然后在Java中,你可以这样做:

@Value("${cities}") 
private String cities; 

其中your.properties包含此:

cities = my test string 
0

Spring属性不会覆盖System属性。它以另一种方式工作。你应该从Spring而不是从System.getProperties()获得你的所有房产。 System属性将覆盖具有相同名称的Spring属性。您所设置的SYSTEM_PROPERTIES_MODE_OVERRIDE表示,当您从Spring获得物业值时,System属性将获胜。

您想要将该值设置为SYSTEM_PROPERTIES_MODE_FALLBACK。这是默认设置,所以您实际上不需要设置它。

如果你有这个想法,@NimChimpsky有它访问属性值正确的方法:

@Value("${nameFromPropertyFileOrSystemProperty}") 
private String someThingFromProperty;