簡體   English   中英

是否可以在Spring配置文件中讀取系統屬性和自定義屬性的組合?

[英]Is it possible to read a combination of a System Property and a Customized Property in Spring config file?

我需要知道在Spring中是否有可能通過在PropertyFile上定義的System-Property和Customized-Property的組合來得出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資源[/WEB-INF/spring/spring-config.xml]中定義了名稱為“ myDataSource”的無效bean定義:無法解析占位符“ 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資源[/WEB-INF/spring/spring-config.xml]中定義了名稱為“ myDataSource”的無效bean定義:無法解析占位符“ my.database.jdbcUrl” ,在字符串值“ $ {app.Env}。$ {my.database.jdbcUrl}”中

有人可以幫我指出我可能在犯什么錯誤以及該問題的可能解決方法嗎?

1)您可以將系統屬性讀取到Spring bean中:

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

然后使用多個屬性解析器

2)您可以使用PropertyPlaceholderConfigurer標志systemPropertiesMode

3)您可以編寫自定義bean工廠 ,該工廠將根據系統屬性和文件屬性生成單個java.util.Properties對象。

那個豆會有方法

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>

暫無
暫無

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

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