我在应用程序上下文中使用Spring 3和Spring的property-placeholders:<context:property-placeholder location="my.properties"/>
my.properties包含:
key1=value1
key2=some JSP code ${some-model-attr}
问题是,
my.properties
中的值也针对占位符进行了评估,但是在我的情况下,这些值包含JSP EL,这会在Spring初始化期间导致“找不到属性”错误:java.lang.IllegalArgumentException: Could not resolve placeholder 'some-model-attr'
到目前为止,我有此解决方法,但这很丑陋:
key1=value1
key2=some JSP code #{'$'}{some-model-attr}
因此,我的问题是:
是否可以告诉Spring不要插值属性占位符值,或者换句话说,不要递归评估占位符?
最佳答案
似乎无法告诉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}