0

私はプロパティファイルを持っています -

application.properties (以下の内容)

core.microsite=q=MarketId:${marketId}&q=PresaleOff

ここに私の春の設定xmlがあります -

<bean id="myBean" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="ignoreUnresolvablePlaceholders" value="true" />
        <property name="location" value="classpath:/application.properties" />
     </bean>

<bean id="MyQueryBuilder" class="com.search.builder.impl.MyQueryBuilder">
        <property name="queryTemplateMap">
            <map>
                <entry key="microsite" value="${core.microsite}" />
            </map>
        </property>
    </bean>

サーバーの起動時(tomocat)に、この例外が発生します-

ug 29, 2012 11:50:05 AM org.apache.catalina.core.StandardContext listenerStart
SEVERE: Exception sending context initialized event to listener instance of class org.springframework.web.context.ContextLoaderListener
org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name 'MyQueryBuilder' defined in URL [jar:file:/C:/apache-tomcat-6.0.35/webapps/my-service/WEB-INF/lib/my-app-1.0.2.RC8-SNAPSHOT.jar!/META-INF/spring/config/app-context.xml]: Could not resolve placeholder 'marketId'
    at org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.processProperties(PropertyPlaceholderConfigurer.java:287)
    at org.springframework.beans.factory.config.PropertyResourceConfigurer.postProcessBeanFactory(PropertyResourceConfigurer.java:75)
    at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:663)

core.microsite プロパティが内部的にもう 1 つのプレースホルダー${marketId}を持っているため、明らかに失敗します。

この問題を解決するにはどうすればよいですか?

「ignoreUnresolvablePlaceholders」をtrueに設定すると(理論的には)機能するはずです。今何をすべきかわからない?

ポインタに感謝します!

ありがとう。

4

1 に答える 1

1

エラーの根本的な原因については完全にはわかりませんが、いくつかの回避策をお勧めします。

回避策 1 : プレースホルダーのプレフィックスを次のように変更します。

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:/application.properties"/>
    <property name="placeholderPrefix" value="%{"></property>
</bean>

<bean id="MyQueryBuilder" class="com.search.builder.impl.MyQueryBuilder">
    <property name="queryTemplateMap">
        <map>
            <entry key="microsite" value="%{core.microsite}" />
        </map>
    </property>
</bean>

回避策 2 : プロパティ値に $ を含める必要がある場合は、一時的に ${marketId} を別の %{marketId} に変更@PostConstructし、MyQueryBuilder にマップ エントリを見て、すべてを見つけて置換します。 ${marketId} での %{marketId} の出現

于 2012-08-30T02:15:43.377 に答える