我想要转义我的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'。我尝试了很多可能的语法,但却找不到合适的语法。
答案 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."))
检查