我在应用程序上下文中使用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}

10-06 04:12
查看更多