2011-11-21 200 views
1

我们访问Java属性在春天这样的:PropertyPlaceHolder春季

<property name="fileSizeLimit" value="${someProperty}" /> 

bean的声明

int fileSizeLimit = 9999; 

如何设置一个默认的,如果“someProperty”的性质 - 缺失文件?

ATM,我们得到NumberFormatException,因为spring会调用带有属性“someProperty”名称的int设置器。财产设置后,一切正常。

http://static.springsource.org/spring/docs/1.1.5/api/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.html说:

默认属性值可以通过“属性”来定义,要压倒一切的定义 属性文件可选。如果配置程序无法解析具有任何指定的 属性的占位符,它还将检查系统属性 (例如“user.dir”)。这可以通过“systemPropertiesMode”进行定制。

这是否设置查找属性的顺序?我在哪里配置?

TIA,Bastl。

回答

11

对于第一个问题,可以使用以下语法为占位符设置默认值,其中9999是默认值。

<property name="fileSizeLimit" value="${someProperty:9999}" /> 

对于第二个问题,属性systemPropertiesModeName决定属性的解析顺序,属性文件与系统属性的顺序。例如,

<property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> 

告诉PropertyPlaceholderConfigurer看系统属性的属性文件之前。

为systemPropertiesModeName值是:

SYSTEM_PROPERTIES_MODE_FALLBACK (default) 
     Check system properties if not resolvable in the specified properties. 
SYSTEM_PROPERTIES_MODE_NEVER 
     Never check system properties. 
SYSTEM_PROPERTIES_MODE_OVERRIDE 
     Check system properties first, before trying the specified properties. 

我通常使用SYSTEM_PROPERTIES_MODE_OVERRIDE和默认值在我的占位符,所以为了将

  1. 系统属性
  2. 属性文件
  3. 占位符默认
2

在春季3,你可以做${someProperty:defaultValue}。我真的希望你没有使用1.1.5。

2

您可以在xml文件的bean定义中为PropertyPlaceHolder定义默认值。

<bean 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" 
    id="corePlaceHolder"> 
      <property name="ignoreUnresolvablePlaceholders" value="true"/> 
      <property name="systemPropertiesModeName" 
         value="SYSTEM_PROPERTIES_MODE_OVERRIDE"/> 
      <property name="searchSystemEnvironment" value="true"/> 
      <property name="locations"> 
      <list> 
       <value>classpath*:config/*/......./*.properties</value> 
      </list> 
      </property> 
      <property name="properties"> 
       <props> 
       <prop key="fileSizeLimit">123</prop> 
       </props> 
      </property> 
</bean> 

进一步的细节

1

当使用PropertyPlaceholderConfigurer,根据its Javadoc“的占位符属性文件应该包含为每个定义的占位符的条目”见http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.html

但是,您可以为您的PropertyPlaceholderConfigurer提供多个位置(属性文件),并将其中一个用作默认值。这样你可以确保你总是有你需要的默认值。

如果您希望应用程序在使用未定义属性时引发异常,请确保在PropertyPlaceholderConfigurer中将“ignoreUnresolvablePlaceholders”设置为false。