如何以编程方式更改XML中的值

时间:2016-12-08 13:31:33

标签: java xml spring xslt spring-batch

我有一个弹簧批量申请。用于存储spring批处理作业的元数据的数据库配置如下:

在application-context.xml中:

<!-- stored job-meta in database - H2 -->
    <bean id="jobRepository"
        class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
        <property name="dataSource" ref="dataSourceMetaData" />
        <property name="transactionManager" ref="transactionManager" />
        <property name="databaseType" value="h2" />    
    </bean>

在database.xml中:

<!-- configure H2 database connection -->
<bean id="dataSourceMetaData"
      class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:~/metaDataProd" />
</bean>

现在,应用程序可以在多个实例中的相同环境中运行,例如:prod&amp;一个测试实例。所以我必须使value="jdbc:h2:~/metaDataProd可配置,以便两个实例都不访问同一个数据库。

如果我从配置文件生成值,我可以很容易地做到这一点。但我想知道是否有任何自动方式这样做。例如:启动应用程序实例时,会按照value="jdbc:h2:~/metaData2Jul value="jdbc:h2:~/metaData4Jul

的编程方式附加日期值

2 个答案:

答案 0 :(得分:2)

您可以使用PropertySourcesPlaceholderConfigurer并从各种来源初始化值,例如环境变量,外部属性文件等。然后使用$ {propname}占位符代替硬编码值。

另见related qeustion

如果您不需要区分实例但只是希望它们不同,那么使用SpEL的方法非常简单。以下任何一项都可以完成这项工作:

<property name="url" value="#{ 'jdbc:h2:~/metaData' + T(java.lang.System).nanoTime() }" />

<property name="url" value="#{ 'jdbc:h2:~/metaData-' + T(java.util.UUID).randomUUID() }" />

<property name="url" value="#{ 'jdbc:h2:~/metaData-' + (new java.text.SimpleDateFormat('ddmm_hh_mm_ss')).format(new java.util.Date()) }" />

如果您无法控制spring.xml或应用程序但可以在启动之前执行某些脚本,则可以在脚本中生成名称并替换xml中的jdbc url值(取决于脚本语言,有无穷无尽的解决方案在这里SO)。

答案 1 :(得分:0)

您可以为此指定JNDI属性并在init uisng initialContext()方法中加载该属性,如下所示:

new InitialContext(environment).lookup(myServiceJndiName);

在本案例测试环境或生产环境中,您可以为不同的环境指定不同的jndi值。