Spring属性文件中的Escape属性引用

时间:2012-10-31 16:17:57

标签: spring properties escaping curly-braces

我想要转义我的Spring propeties文件以获取我的bean属性:${ROOTPATH}/relativePath

我有一个简单的Spring配置文件,其中包含:

<context:property-placeholder location="classpath:myprops.properties" />

<bean id="myBean" class="spring.MyBean">
    <property name="myProperty" value="${myproperty}" />
</bean> 

myprops.properties包含:

myproperty=\${ROOTPATH}/relativePath

以上设置返回:无法解析占位符'ROOTPATH'。我尝试了很多可能的语法,但却找不到合适的语法。

4 个答案:

答案 0 :(得分:10)

而不是${myproperty}使用#{'$'}{myproperty}。只需将$替换为#{'$'}

答案 1 :(得分:2)

到目前为止,似乎无法逃脱${},但您可以尝试以下配置来解决问题

dollar=$

myproperty=${dollar}{myproperty}

评估后myproperty的结果为${myproperty}

答案 2 :(得分:2)

Here是一张Spring票,要求逃避支持(在撰写本文时仍未解决)。

使用

的解决方法
$=$
myproperty=${$}{ROOTPATH}/relativePath

确实提供了解决方案,但看起来很脏。

使用像#{'$'}这样的SPEL表达式对我来说不适用于Spring Boot 1.5.7。

答案 3 :(得分:0)

虽然它有效,但转义占位符非常丑陋。

我通过覆盖 PropertySourcesPlaceholderConfigurer.doProcessProperties 并使用自定义 StringValueResolver

 public static class CustomPropertySourcesPlaceholderConfigurer extends PropertySourcesPlaceholderConfigurer {

    @Override
    protected void doProcessProperties(ConfigurableListableBeanFactory beanFactoryToProcess, StringValueResolver valueResolver) {
        StringValueResolver customValueResolver = strVal -> {
            if(strVal.startsWith("${something.")) {
                PropertySourcesPropertyResolver customPropertySourcesPropertyResolver = new PropertySourcesPropertyResolver(this.getAppliedPropertySources());
                String resolvedText = customPropertySourcesPropertyResolver.resolvePlaceholders(strVal);

                //remove the below check if you are okay with the property not being present (i.e remove if the property is optional)
                if(resolvedText.equals(strVal)) {
                    throw new RuntimeException("placeholder " + strVal + " not found");
                }
                return resolvedText;
            }
            else {
                //default behaviour
                return valueResolver.resolveStringValue(strVal);
            }
        };
        super.doProcessProperties(beanFactoryToProcess, customValueResolver);
    }
}

将其插入应用程序

@Configuration
public class PlaceHolderResolverConfig
{
  @Bean
  public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
     PropertySourcesPlaceholderConfigurer placeHolderConfigurer = new CustomPropertySourcesPlaceholderConfigurer();
     placeHolderConfigurer.setLocation(new ClassPathResource("application.properties"));
    
     return placeHolderConfigurer;
  }
}

在上面的例子中,对于所有以 something.* 开头的属性,嵌套的占位符都不会被解析。 如果您想要所有属性的行为,请删除 if(strVal.startsWith("${something.")) 检查