【问题标题】:Is it possible to read a combination of a System Property and a Customized Property in Spring config file?是否可以在 Spring 配置文件中读取系统属性和自定义属性的组合?
【发布时间】:2013-05-07 10:06:52
【问题描述】:

我需要知道它是否可以在 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.字符串值“#{systemProperties['appEnv']}.${my.database.jdbcUrl}”中的database.jdbcUrl'

我也尝试过:

5) 在 .properties 文件中定义如下属性:
app.Env=dev

6) 修改datasource 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.字符串值“${app.Env}.${my.database.jdbcUrl}”中的 database.jdbcUrl'

有人可以帮我指出我可能犯的错误以及此问题的可能解决方法是什么吗?

【问题讨论】:

    标签: spring properties system customization


    【解决方案1】:

    1) 可以将系统属性读入 Spring bean:

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

    然后使用multiple property resolvers

    2) 您可以使用PropertyPlaceholderConfigurer 的标志systemPropertiesMode

    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>
    

    【讨论】:

    • 感谢 Lukasz 的回复,但是您能否详细说明第 3 步?
    • 我提供了一个示例,请注意这不是一个完整的解决方案,但只是为了使概念清晰所需的代码
    猜你喜欢
    • 2016-08-22
    • 2011-12-02
    • 1970-01-01
    • 2011-03-21
    • 2014-12-21
    • 2019-06-28
    • 2018-09-09
    • 1970-01-01
    • 2013-06-24
    相关资源
    最近更新 更多