2012-02-05 55 views
2

我使用Spring 3和Spring的財產佔位符在我的應用程序上下文屬性值的插值:如何禁用財產佔位符

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

my.properties包含:

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

問題是,my.properties也針對佔位符進行評估,但在我的情況下,這些值包含JSP EL,導致「找不到屬性」錯誤dur荷蘭國際集團春初始化:

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

到目前爲止,我有這個解決辦法,但它的醜陋:

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

因此我的問題:

是否可以告訴Spring不插財產佔位符值,換句話說,不要評估佔位符遞歸?

回答

4

看起來不可能告訴Spring不要遞歸評估佔位符。

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

所以遞歸調用硬編碼到評價:

佔位符由org.springframework.util.PropertyPlaceholderHelper其中(在Spring 3)包含以下行評價。

但是我認爲你可以改變佔位符的默認前綴和後綴,以便爲Spring佔位符使用不同的語法。 <context:property-placeholder>只是構建org.springframework.beans.factory.config.PropertyPlaceholderConfigurer類的一種便捷方式,並且該類具有方法setPlaceholderPrefix()setPlaceholderSuffix()。你可以使用這些方法來春佔位符的語法更改爲類似:

$[property] 

,而不是

${property} 

然後我想到春天也不會了,因爲他們是你的解析性能JSP在一個不同的語法:

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

一種解決方法是使用SpEL expression templating。例如:

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

這工作,因爲春天不再看到的${配置屬性佔位符前綴。然而,使用SpEL表達式求的字符串連接:

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

其是相同

some JSP code ${some-model-attr}