You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 10:37:27