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

标签 java xml spring xslt spring-batch

我有一个 Spring 批量应用程序。用于存储 Spring Batch 作业元数据的数据库配置如下:

在 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>

现在应用程序可以在同一环境中的多个实例中运行,例如:一个用于生产的实例和一个用于测试的实例。所以我必须制作 value="jdbc:h2:~/metaDataProd可配置,以便两个实例不会访问同一数据库。

如果我从配置文件生成值,我可以轻松做到这一点。但我想知道是否有任何自动方法可以做到这一点。例如:启动应用程序实例时,会以编程方式附加日期值,如下所示 value="jdbc:h2:~/metaData2Jul value="jdbc:h2:~/metaData4Jul

最佳答案

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

另请参阅related question .

如果你不需要区分实例,只是想让它们不同,有一个非常简单的方法 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 值(取决于脚本语言,这里有无数的解决方案上)。

关于java - 如何以编程方式更改 XML 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41040743/

相关文章:

java - SoundPool: "path"中的 "load(String path, int priority)"是什么

java - 没有从java中的当前目录返回以前的路径名2文件夹

c# - "DOCTYPE NEWFILE SYSTEM"是什么意思?

java - JdbcTemplate 插入成功但数据库中没有行

java - Spring Boot 应用程序的测试如何进行

java - Struts2 排除模式 - 它到底是如何工作的?

java - HashingFunction 与 Arrays.hashCode 兼容

java - 二进制 XML 文件行 #13 :Error inflating class fragment

android - 对 strings.xml 文件的更改是否需要编译才能使更改生效?

java - MyBatis Spring 事务