15

我想转义我的 Spring 属性文件以获取我的 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

4 回答 4

16

而不是${myproperty}使用#{'$'}{myproperty}. 只需替换$#{'$'}.

于 2014-01-22T18:35:41.327 回答
3

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

dollar=$

myproperty=${dollar}{myproperty}

myproperty 的结果将${myproperty}在评估之后。

于 2018-02-21T02:45:04.927 回答
2

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

使用的解决方法

$=$
myproperty=${$}{ROOTPATH}/relativePath

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

在 Spring Boot 1.5.7 中使用 SPEL 表达式#{'$'}对我不起作用。

于 2018-02-22T13:23:14.840 回答
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."))如果您想要所有属性的行为,请删除检查

于 2021-06-19T14:56:00.180 回答