JdbcMetadataStore SQL语法错误:FTP适配器持久化元数据存储异常
问题诊断与修复方案
从你给出的错误日志和代码来看,核心问题是**JdbcMetadataStore生成的SQL语句中保留了未替换的%s占位符**,导致H2数据库无法解析语法,抛出BadSqlGrammarException。
问题根源
当你通过JdbcMetadataStore(dataSource)直接实例化元数据存储时,没有指定表前缀,而JdbcMetadataStore默认的SQL模板依赖表前缀占位符%s来生成合法的SQL语句。由于缺少这个配置,占位符没有被替换,最终生成了INSERT INTO %sMETADATA_STORE...这种无效SQL。
同时,你可能还没有初始化METADATA_STORE对应的数据库表,这也是潜在的问题点。
修复步骤
1. 为JdbcMetadataStore配置表前缀
修改你的Bean定义代码,显式设置表前缀。针对H2数据库(默认使用PUBLIC schema),你可以设置为空字符串或者PUBLIC.:
@Bean fun ftpPersistentAcceptOnceFileListFilter(dataSource: DataSource): FtpPersistentAcceptOnceFileListFilter { val metadataStore = JdbcMetadataStore(dataSource) // H2环境下设置空前缀即可,或者指定schema:"PUBLIC." metadataStore.setTablePrefix("") return FtpPersistentAcceptOnceFileListFilter(metadataStore, "clientOrderfile") }
2. 初始化METADATA_STORE表
Spring Integration提供了针对H2的建表脚本,你需要让Spring Boot自动执行它:
- 在
application.properties中添加以下配置:
# 启用数据源初始化 spring.datasource.initialization-mode=always # 指定H2对应的建表脚本 spring.datasource.schema=classpath:org/springframework/integration/jdbc/schema-h2.sql
或者在Spring Boot启动类上添加@Sql注解来加载脚本:
@SpringBootApplication @Sql("classpath:org/springframework/integration/jdbc/schema-h2.sql") public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
3. 验证修复
重启应用后,H2数据库会自动创建METADATA_STORE表,JdbcMetadataStore会生成合法的SQL语句(占位符%s被替换为空字符串,最终表名为METADATA_STORE),从而解决语法错误问题。
内容的提问来源于stack exchange,提问作者user9717940
相关产品推荐
相关产品推荐

