非Spring Boot的Spring 5应用初始化JdbcMetadataStore的PostgreSQL schema方案
解答
你之前配置的spring.integration.jdbc.initialize-schema、spring.integration.jdbc.schema属性属于Spring Boot自动配置模块专属能力,原生Spring Framework没有内置对这两个属性的解析逻辑,因此不会生效。
以下是两种Spring原生支持的标准方案,不需要自行编写执行SQL脚本的逻辑:
方案1:使用Spring JDBC自带的DataSourceInitializer组件
这是通用的数据库脚本初始化方案,适用于所有需要启动执行SQL的场景:
JavaConfig 配置示例
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.jdbc.datasource.init.DataSourceInitializer; import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; import javax.sql.DataSource; @Configuration public class IntegrationSchemaConfig { @Bean public DataSourceInitializer integrationSchemaInitializer(DataSource dataSource) { ResourceDatabasePopulator populator = new ResourceDatabasePopulator(); // 加载Spring Integration内置的PostgreSQL schema脚本 populator.addScript(new ClassPathResource("org/springframework/integration/jdbc/schema-postgresql.sql")); // 可选:忽略表已存在的报错,适配重复启动场景 populator.setIgnoreFailedDrops(true); // 可选:脚本执行出错时是否终止应用启动,默认true populator.setContinueOnError(false); DataSourceInitializer initializer = new DataSourceInitializer(); initializer.setDataSource(dataSource); initializer.setDatabasePopulator(populator); return initializer; } }
XML 配置示例
<bean id="integrationSchemaInitializer" class="org.springframework.jdbc.datasource.init.DataSourceInitializer"> <property name="dataSource" ref="你的数据源Bean名称"/> <property name="databasePopulator"> <bean class="org.springframework.jdbc.datasource.init.ResourceDatabasePopulator"> <property name="scripts"> <list> <value>classpath:org/springframework/integration/jdbc/schema-postgresql.sql</value> </list> </property> <property name="ignoreFailedDrops" value="true"/> </bean> </property> </bean>
方案2:直接使用JdbcMetadataStore内置的初始化能力
你使用的Spring Integration 5.3.x版本的JdbcMetadataStore自带schema初始化开关,不需要额外注册初始化组件,配置更简单:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.integration.jdbc.metadata.JdbcMetadataStore; import javax.sql.DataSource; @Configuration public class MetadataStoreConfig { @Bean public JdbcMetadataStore jdbcMetadataStore(DataSource dataSource) { JdbcMetadataStore metadataStore = new JdbcMetadataStore(dataSource); // 开启启动时自动初始化对应数据库的schema metadataStore.setInitializeDatabase(true); // 保持和脚本默认前缀一致即可,如有自定义需求可修改 metadataStore.setTablePrefix("INT_"); return metadataStore; } }
注意事项
- 两种方案都依赖Spring上下文中已经正确配置的可用
DataSourceBean,会自动注入使用 - 生产环境可自行增加开关配置控制初始化逻辑是否启用,避免重复执行脚本
内容的提问来源于stack exchange,提问作者Kode Charlie
相关产品推荐
相关产品推荐

