0

System-Property と PropertyFile で定義された Customized-Property の組み合わせによって、Spring で Property の値を導出できるかどうかを知る必要があります。

私がやったこと:

1) サーバーで -D 引数を次のように構成しました: -Dapp.Env="dev"
2) 私の spring-config.xml で、以下のようにデータソースの詳細を定義しました:

<!--  DataSource configurations -->
<bean id="myDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
    init-method="init" destroy-method="close">
    <property name="uniqueResourceName" value="myDataSource" />
    <property name="xaDataSourceClassName" value="${my.database.xaDriver.class}" />
    <property name="xaProperties">
        <props>

            <prop key="URL">#{systemProperties['appEnv']}.${my.database.jdbcUrl}</prop>
            <prop key="user">#{systemProperties['appEnv']}.${my.database.user}</prop>
            <prop key="password">#{systemProperties['appEnv']}.${my.database.password}</prop>

        </props>

    </property>
    <property name="maxPoolSize" value="${my.database.maxPoolSize}" />
    <property name="minPoolSize" value="${my.database.minPoolSize}" />
    <property name="borrowConnectionTimeout" value="60" /> 
    <property name="maintenanceInterval" value="120" />  
</bean>

3) .properties ファイルで次のプロパティを定義しました: my.database.xaDriver.class=oracle.jdbc.xa.client.OracleXADataSource
my.database.initialPoolSize=2
my.database.maxPoolSize=10
my.database.minPoolSize=2

dev.my.database.jdbcUrl=jdbc:oracle:thin:@test.com:1535:myDb
dev.my.database.user=myuserid
dev.my.database.password=mypwd

4) spring-config.xml で .properties ファイルの場所を次のように定義しました。

<context:property-placeholder location="/WEB-INF/spring/spring-config.properties" /> 

サーバーの起動時に得られるもの:

スロー可能が発生しました: org.springframework.beans.factory.BeanDefinitionStoreException: ServletContext リソースで定義された名前 'myDataSource' の無効な Bean 定義 [/WEB-INF/spring/spring-config.xml]: プレースホルダー 'my.database.jdbcUrl を解決できませんでした' 文字列値の "#{systemProperties['appEnv']}.${my.database.jdbcUrl}"

私も試したこと:

5) 以下のように .properties ファイルにプロパティを定義:
app.Env=dev

6) データソース Bean の構成を次のように変更しました。

            <prop key="URL">${app.Env}.${my.database.jdbcUrl}</prop>
            <prop key="user">${app.Env}.${my.database.user}</prop>
            <prop key="password">${app.Env}.${my.database.password}</prop>

ただし、サーバーの起動時に、同じ例外メッセージが表示されます:

スロー可能が発生しました: org.springframework.beans.factory.BeanDefinitionStoreException: ServletContext リソースで定義された名前 'myDataSource' の無効な Bean 定義 [/WEB-INF/spring/spring-config.xml]: プレースホルダー 'my.database.jdbcUrl を解決できませんでした' 文字列値 "${app.Env}.${my.database.jdbcUrl}" 内

誰かが私がやっているかもしれない間違いと、この問題の可能な修正とは何かを指摘するのを手伝ってもらえますか?

4

1 に答える 1

0

1) システム プロパティを Spring Bean に読み込むことができます。

<bean id="systemProperties" class="java.lang.System" factory-method="getProperties"/>

次に、複数のプロパティリゾルバーを使用します

2)次のフラグsystemPropertiesModeを使用できますPropertyPlaceholderConfigurer

3)システム プロパティとファイル プロパティから単一のオブジェクトを生成するカスタムBean ファクトリを作成できます。java.util.Properties

その Bean にはメソッドがあります

public Properties merge() {
    Properties merged = new Properties();
    for (Properties p : properties) {
        if (p != null) {
            merged.putAll(p);
        }
    }
    return merged;
}

そのように春に呼び出されます:

<bean id="factory" class="my.Factory">
    <property name="properties">
        <util:list>
            <bean class="java.lang.System" factory-method="getProperties"/> 
            <bean ref="otherProperties">
        </util:list>
    </property>
</bean>
于 2013-05-14T11:47:06.233 に答える