如何禁用属性占位符中的属性值插值

时间:2012-02-05 22:03:34

标签: spring

我在我的应用程序环境中使用Spring 3和Spring的属性占位符:

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

my.properties包含:

key1=value1
key2=some JSP code ${some-model-attr}

问题是,my.properties中的也会针对占位符进行评估,但在我的情况下,值包含JSP EL,导致找不到&#34;属性&#34 ; Spring初始化期间的错误:

java.lang.IllegalArgumentException: Could not resolve placeholder 'some-model-attr'

到目前为止,我有这种解决方法,但它很难看:

key1=value1
key2=some JSP code #{'$'}{some-model-attr}

因此我的问题是:

是否可以告诉Spring不要插入属性占位符值,换句话说,不要递归地评估占位符?

2 个答案:

答案 0 :(得分:4)

看起来不可能告诉Spring不要递归地评估占位符。

占位符由org.springframework.util.PropertyPlaceholderHelper评估,(在Spring 3中)包含以下行:

    // Recursive invocation, parsing placeholders contained in the placeholder key.
    placeholder = parseStringValue(placeholder, placeholderResolver, visitedPlaceholders);

因此,递归调用被硬编码到评估中。

但是我认为您可以更改占位符的默认前缀和后缀,以便为Spring占位符使用不同的语法。 <context:property-placeholder>只是构建org.springframework.beans.factory.config.PropertyPlaceholderConfigurer类的便捷方式,该类包含方法setPlaceholderPrefix()setPlaceholderSuffix()。您可以使用这些方法将Spring占位符的语法更改为:

$[property]

而不是

${property}

然后我希望Spring不再解析你的JSP属性,因为它们的语法不同:

key2=some JSP code ${some-model-attr}

答案 1 :(得分:2)

作为解决方法,您可以使用SpEL expression templating。例如:

key2=some JSP code $#{'{some-model-attr}'}

这是有效的,因为Spring不再看到配置的属性占位符前缀${。但是,SpEL表达式求值为以下字符串连接:

'some JSP code $' + '{some-model-attr}' 

相同
some JSP code ${some-model-attr}