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

rus*_*tyx 5 spring

我在我的应用程序上下文中使用 Spring 3 和 Spring 的属性占位符:

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

my.properties 包含:

key1=value1
key2=some JSP code ${some-model-attr}
Run Code Online (Sandbox Code Playgroud)

问题是,该my.properties对占位符也被评估,但对我来说,值包含JSP EL,导致春季初始化过程中的错误“未找到属性”:

java.lang.IllegalArgumentException: Could not resolve placeholder 'some-model-attr'
Run Code Online (Sandbox Code Playgroud)

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

key1=value1
key2=some JSP code #{'$'}{some-model-attr}
Run Code Online (Sandbox Code Playgroud)

因此我的问题是:

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

gut*_*tch 4

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

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

    // Recursive invocation, parsing placeholders contained in the placeholder key.
    placeholder = parseStringValue(placeholder, placeholderResolver, visitedPlaceholders);
Run Code Online (Sandbox Code Playgroud)

因此,递归调用被硬编码到计算中。

不过,我认为您可以更改占位符的默认前缀和后缀,以便对 Spring 占位符使用不同的语法。<context:property-placeholder>只是构造org.springframework.beans.factory.config.PropertyPlaceholderConfigurer类的一种便捷方法,并且该类具有方法setPlaceholderPrefix()setPlaceholderSuffix()。您可以使用这些方法将 Spring 占位符的语法更改为:

$[property]
Run Code Online (Sandbox Code Playgroud)

代替

${property}
Run Code Online (Sandbox Code Playgroud)

然后我预计 Spring 将不再解析您的 JSP 属性,因为它们采用不同的语法:

key2=some JSP code ${some-model-attr}
Run Code Online (Sandbox Code Playgroud)