我在我的应用程序环境中使用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不要插入属性占位符值,换句话说,不要递归地评估占位符?
答案 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}