簡體   English   中英

PropertyPlaceholderConfigurer,用於讀取屬性文件和數據庫

[英]PropertyPlaceholderConfigurer for reading property files and database

我正在嘗試創建兩個PropertyPlaceholderConfigurer,一個用於訪問屬性文件,另一個用於訪問數據庫。代碼如下

  <bean id="otherPropertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
        <property name="properties">
        <bean class="org.apache.commons.configuration.ConfigurationConverter" factory-method="getProperties">
            <constructor-arg>
                <bean class="org.apache.commons.configuration.DatabaseConfiguration">
                    <constructor-arg ref="myDataSource"/>
                     <constructor-arg value="dbo.APPLICATIONPROPERTIES"/>
                     <constructor-arg value="NAME"/>
                   <constructor-arg value="VALUE"/>
                </bean>
            </constructor-arg>
        </bean>
        </property>
    </bean>

  <bean id="propertyConfigurer" class="com.fexco.wuams.util.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:database.properties</value>
            </list>         
        </property>
    </bean>

我有以下ComboPooledDataSource bean

<bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="${driver}"/>
    <property name="jdbcUrl" value="${url}"/>
    <property name="user" value="${username}"/>
    <property name="password" value="${password}"/>
    <property name="initialPoolSize" value="5"/>
    <property name="minPoolSize" value="5"/>
    <property name="maxPoolSize" value="5"/>
    <property name="maxIdleTime" value="1200"/>
    <property name="idleConnectionTestPeriod" value="300"/>
  </bean>

這對我的應用程序的其余部分完美地工作,除了當我嘗試將其用於我的bean id="otherPropertyConfigurer" ...我收到以下錯誤

Caused by: org.springframework.beans.PropertyBatchUpdateException; nested PropertyAccessExceptions (1) are:
PropertyAccessException 1: org.springframework.beans.MethodInvocationException: Property 'driverClass' threw exception; nested exception is java.beans.PropertyVetoException: Could not locate driver class with name '${jdbc.driverClassName}'.
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:104)
    at org.springframework.beans.AbstractPropertyAccessor.setPropertyValues(AbstractPropertyAccessor.java:59)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1275)
    ... 72 more

如果我將ComboPooledDataSource的數據庫變量硬編碼(例如,將${jdbc.driverClassName}更改${jdbc.driverClassName}net.sourceforge.jtds.jdbc.Driver一切正常,但是由於某些原因,當我添加otherPropertyConfigurer ,我原來的propertyConfigurer無法正常工作

有人對如何解決這個問題有任何想法嗎?

我討厭成為壞消息的交換者,但是您要實現的目標,Spring在物理上是無法做到的。

因為Springs PropertyPlaceholderConfigurer類作為beanPostProcessors類,所以它會在創建任何其他bean之前創建並調用這些bean。 但是,如果您有多個PropertyPlaceholderConfigurer,而一個依賴另一個,則Spring總是在調用兩個實例之前完全創建兩個實例。 因此,您在myDataSource中的占位符將永遠無法解析。

這個問題可以更好地描述這個問題

解決此問題的最佳方法通常是停止使用數據庫進行配置管理。 我發現最好使用一個簡單的配置文件,該文件可以根據環境進行修改,並托管在您的部署容器中。

正如ConMan所建議的那樣,這不能以我在上面的問題中解釋的方式來完成。 但是我設法解決了這個問題,我改為使用以下代碼將屬性( propertiesFromDB )傳遞給類

<bean id="propertiesFromDB"
        class="org.springframework.beans.factory.config.PropertiesFactoryBean">
        <property name="properties" ref="configurationFactoryBean" />
    </bean>

    <bean name="configurationFactoryBean"
        class="org.springmodules.commons.configuration.CommonsConfigurationFactoryBean">
        <property name="configurations" ref="applicationProperties" />
    </bean>


    <bean id="applicationProperties" class="org.apache.commons.configuration.DatabaseConfiguration">
        <constructor-arg type="javax.sql.DataSource" ref="myDataSource" />
        <constructor-arg index="1" value="dbo.APPLICATIONPROPERTIES" />
        <constructor-arg index="2" value="NAME" />
        <constructor-arg index="3" value="VALUE" />
    </bean>

然后,我可以使用getProperty()方法並傳遞NAME變量來獲取所需的屬性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM