【问题标题】:Spring: How to avoid automatic property resolving in particular placeholderSpring:如何避免在特定占位符中自动解析属性
【发布时间】:2017-01-21 10:59:49
【问题描述】:

我有一个配置文件,其中包含应该注入值的字段。我有一个财产:

@Value("${other.app.start.script:}")
private String startScript;

在这个属性中注入的值是这样的:

/app/${version}/otherAppStarter.bat

因此,Spring 正在尝试在 Context 启动时解析 ${version}。但是我需要在某些进程运行期间在其他时间解决这个值。并且 ${version} 可能会在主应用程序运行期间更改。

有什么方法可以告诉 Spring 不要解析 ${version} 占位符。 我可以将 ${version} 更改为 #[version] 之类的东西,然后 Spring 不会解析这个占位符,但也许有办法使用一些原生 Spring 特性。

谢谢!

【问题讨论】:

标签: java spring configuration


【解决方案1】:

您可以注册一个扩展 PropertySourcesPlaceholderConfigurer 的 static bean 并覆盖其方法 convertPropertyValue。

public class MyPlaceholderConfigurer extends PropertySourcesPlaceholderConfigurer {

    @Override
    protected String convertPropertyValue(String originalValue) {
        if (originalValue.contains("${version}")) {
            return originalValue;
        }

        return super.convertPropertyValue(originalValue);
    }
}

如果您通过 @PropertySource 使用 Java 配置,您还需要覆盖方法 doProcessProperties,如 Spring Jira SPR-8928 中所述:

@Override
protected void doProcessProperties(ConfigurableListableBeanFactory beanFactoryToProcess,
                                   StringValueResolver valueResolver) {

    super.doProcessProperties(beanFactoryToProcess,
            new StringValueResolver() {
                @Override
                public String resolveStringValue(String strVal) {
                    return convertPropertyValue(valueResolver.resolveStringValue(strVal));
                }
            });
}

Java 配置示例如下所示:

@Configuration
@PropertySource("classpath:saml/saml.properties")
public class MyConfiguration {

    @Bean
    public static PropertySourcesPlaceholderConfigurer myPlaceholderConfigurer() {
        return new MyPlaceholderConfigurer();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 2011-07-07
    • 2014-03-23
    • 2021-03-08
    • 1970-01-01
    • 2016-03-04
    • 2015-01-16
    相关资源
    最近更新 更多