0

我需要知道它是否可以在 Spring 中通过结合系统属性和在 PropertyFile 上定义的自定义属性来为属性派生一个值。

我做了什么:

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" /> 

我在服务器启动时得到什么:

Throwable 发生: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>

但是在服务器启动时,我收到相同的异常消息:

Throwable 发生:org.springframework.beans.factory.BeanDefinitionStoreException:在 ServletContext 资源 [/WEB-INF/spring/spring-config.xml] 中定义的名称为“myDataSource”的无效 bean 定义:无法解析占位符“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,从系统属性和文件属性生成单个对象。

那个豆子会有方法

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 回答