2

在加载 JBOSS 应用程序服务器时,我需要覆盖属性文件中给出的属性值。

我尝试使用以下代码覆盖 PropertyPlaceholderConfigurer 中的 processProperties() 方法。

我的属性文件有这个条目

base.url="defaultUrl"

public class CustomPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {

protected String convertPropertyValue(String originalValue) {
    return (originalValue != null) ? originalValue.trim() : originalValue;
}

@Override
protected void processProperties(ConfigurableListableBeanFactory beanFactory, Properties props)
        throws BeansException {
    super.processProperties(beanFactory, props);
    for (Enumeration names = props.propertyNames(); names.hasMoreElements();) {
        String key = (String) names.nextElement();
        props.put("base.url", getUpdatedUrl());
    }
}

}

我在应用程序上下文中的占位符 ${base.url} 中注入 base.url 值。

我应该如何在运行时更新给定属性的值。上面的代码总是取属性文件中的值而不是更新的值。

4

1 回答 1

0

吹掉这个问题的灰尘。这可以使用 PropertyPlaceholderConfigurer 并添加一个新的属性文件(在列表的末尾)来完成,您可以在其中放置要覆盖的属性。(属性文件的名称/文件路径可以包含您在构建时传递的环境变量)。这是的javadoc PropertiesLoaderSupport#setLocations

注意:如果键重叠,以后文件中定义的属性将覆盖先前文件中定义的属性。因此,请确保最具体的文件是给定位置列表中的最后一个文件。

从 Spring 5.2 开始,不赞成使用 PropertySourcesPlaceholderConfigurer:

PlaceholderConfigurerSupport 的专门化,它针对当前 Spring 环境及其一组 PropertySource 解析 bean 定义属性值和 @Value 注释中的 ${...} 占位符。

这里有一些例子

于 2019-11-29T10:16:15.297 回答