我们在Spring中访问一个java属性:
<property name="fileSizeLimit" value="${someProperty}" />
bean声明
int fileSizeLimit = 9999;
如果属性文件中缺少“someProperty”,如何设置默认值?
ATM,我们得到NumberFormatException,因为spring使用属性“someProperty”的名称调用int-setter。设置属性后,一切正常。
可以通过“属性”定义默认属性值,以生成重写定义 在属性文件中可选。配置程序还将检查系统属性 (例如“user.dir”)如果它无法解析任何指定的占位符 属性。这可以通过“systemPropertiesMode”自定义。
这是否设置了查找属性的顺序?我在哪里配置它?
TIA,Bastl。
答案 0 :(得分:13)
对于第一个问题,您可以使用以下语法为占位符设置默认值,其中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)
在Spring 3中,你可以${someProperty:defaultValue}
。我真的希望你不要使用1.1.5。
答案 2 :(得分: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>
答案 3 :(得分:1)
根据its Javadoc使用PropertyPlaceholderConfigurer时,“占位符属性文件应包含每个已定义占位符的条目”。
但是,您可以为PropertyPlaceholderConfigurer提供多个位置(属性文件),并将其中一个用作默认值。这样,您可以确保始终拥有所需的默认值。
如果您希望应用程序在使用未定义属性时抛出异常,请确保PropertyPlaceholderConfigurer中的“ignoreUnresolvablePlaceholders”设置为false。