【发布时间】:2011-10-25 07:18:43
【问题描述】:
我正在使用 PropertiesFactoryBean 从典型的 Properties 文件中加载属性。有没有办法让 Spring 自动从 prop 值中修剪尾随空格?
【问题讨论】:
标签: java spring configuration properties
我正在使用 PropertiesFactoryBean 从典型的 Properties 文件中加载属性。有没有办法让 Spring 自动从 prop 值中修剪尾随空格?
【问题讨论】:
标签: java spring configuration properties
您可以通过将自定义PropertiesPersister 传递到您的PropertiesFactoryBean 配置来自定义Properties 加载功能。 PropertiesFactoryBean 使用PropertiesPersister 实例来解析属性文件数据。默认实现遵循java.util.Properties 的本机解析。您可以通过提供自己的PropertiesPersister 接口实现来自定义解析逻辑。
【讨论】:
您可以定义自己的属性配置器:
package your.company.package;
public class TrimPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {
@Override
protected String resolvePlaceholder( String placeholder, Properties props ) {
String value = super.resolvePlaceholder( placeholder, props );
return (value != null ? value.trim() : null );
}
}
那么你必须在你的 bean_config.xml 中定义它
<bean id="applicationProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="location" value="classpath:main.properties" />
</bean>
<bean id="trimPropertyPlaceholderConfigurer" class="your.company.package.TrimPropertyPlaceholderConfigurer">
<property name="properties" ref="applicationProperties" />
</bean>
如果您使用 @Value 注释将属性设置到字段中,另一种方法:
@Value( value = "#{applicationProperties['my.app.property'].trim()}" )
如果文件中不存在该属性,则抛出 NullPointerException
【讨论】:
正如 Chad 所说,Spring 用 4.3RC1 版本解决了这个问题。但是您需要像这样使用参数“trimValues”手动设置修剪功能(默认为“false”):
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="trimValues" value="true"/>
<property name="locations">
<list>
...
</list>
</property>
我没有找到任何关于此的文档,但我从 Spring API 中推断出来。
【讨论】:
使用最新的 Spring 版本(4.3+),当您在配置中创建 PropertySourcesPlaceholderConfigurer bean 时,您可以简单地调用 setTrimValues() 并设置为 true。这将从您从属性文件中获得的值中删除任何额外的前导或尾随空格。
【讨论】:
由于在使用 Spring Boot 时这通常会造成混淆,我想补充一点,您不需要需要 XML 配置来提供您自己的PropertyPlaceholderConfigurer。
只需将它放在你的主类中:
@Bean
public static PropertySourcesPlaceholderConfigurer createPropertyConfigurer()
{
PropertySourcesPlaceholderConfigurer propertyConfigurer = new PropertySourcesPlaceholderConfigurer();
propertyConfigurer.setTrimValues(true);
return propertyConfigurer;
}
这足以修剪来自application.properties 的值。
【讨论】: