0

我在我的 tomcat context.xml 文件中设置了一些属性,如下所示

<Parameter name="foobar" value="something" />

我正在使用符号 ${foobar} 将这些值读入我的 spring XML。当我使用 context:property-placeholder 标记时,这很好用,但是当我直接将其定义为 PropertyPlaceHolderConfigurer bean 时,我收到以下错误:

无法解析字符串值“${foobar}”中的占位符“foobar”

旧(工作):

<context:property-placeholder location="/WEB-INF/classes/*.properties" />

新的(不工作):

<bean id="propertyPlaceholderConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>/WEB-INF/classes/app.properties</value>
            <value>/WEB-INF/classes/security.properties</value>
        </list>
    </property>
</bean>
4

2 回答 2

1

我怀疑你正在回退到这个旧的表示法,或者是因为你被迫使用旧版本的 spring,或者你想使用多个位置和context:property-placeholder.

旧版本的弹簧

当使用旧版本的 spring 来获得这个功能时,你应该使用ServletContextPropertyPlaceholderConfigurer. 它不需要 servlet 容器来工作,因为它将回退到像PropertyPlaceholderConfigurer一样。因此,要调整您的示例:

<bean id="propertyPlaceholderConfigurer"
    class="org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>/WEB-INF/classes/app.properties</value>
            <value>/WEB-INF/classes/security.properties</value>
        </list>
    </property>
</bean>

默认情况下,位置中定义的属性优先,但这是可选的。

使用多个位置context:property-placeholder

对于较新版本的 spring,您可以使用 context xml property-placeholder 来加载多个配置文件:

<context:property-placeholder location="/WEB-INF/classes/app.properties" order="1" ignore-unresolvable="true" />
<context:property-placeholder location="/WEB-INF/classes/app.properties" order="2" ignore-unresolvable="true" />

如果您出于其他原因想要使用更显式的 bean,则可以使用PropertySourcesPlaceholderConfigurer用于实现 xml 注释的 bean。但一般人们使用xml接线。

于 2013-07-30T17:58:15.753 回答
1

要使用的正确类是 PropertySourcesPlaceholderConfigurer(从 Spring 3.1 开始)。

<bean id="propertyPlaceholderConfigurer"
    class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>/WEB-INF/classes/app.properties</value>
            <value>/WEB-INF/classes/security.properties</value>
        </list>
    </property>
</bean>

来自 JavaDocs:

PlaceholderConfigurerSupport 的专业化,它针对当前 Spring 环境及其一组 PropertySource 解析 bean 定义属性值和 @Value 注释中的 ${...} 占位符。

于 2013-07-30T18:27:03.343 回答