JdbcMetadataStore - 语法错误 SQL

JdbcMetadataStore -bad SQL grammar

我想要 ftp 适配器使用持久元数据存储。我创建了 FtpPersistentAcceptOnceFileListFilter bean 以自动装配并在我的流定义中使用如下:

    @Bean
    fun ftpPersistentAcceptOnceFileListFilter (dataSource: DataSource): FtpPersistentAcceptOnceFileListFilter {
        return FtpPersistentAcceptOnceFileListFilter(JdbcMetadataStore(dataSource), "clientOrderfile")
    }

当我 运行 我反复获取应用程序时

2020-01-19 12:15:39.291 ERROR 5112 --- [ask-scheduler-4] o.s.integration.handler.LoggingHandler   : org.springframework.messaging.MessagingException: Problem occurred while synchronizing 'order' to local directory; nested exception is org.springframework.messaging.MessagingException: Failed to execute on session; nested exception is org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [INSERT INTO %sMETADATA_STORE(METADATA_KEY, METADATA_VALUE, REGION) SELECT ?, ?, ? FROM %sMETADATA_STORE WHERE METADATA_KEY=? AND REGION=? HAVING COUNT(*)=0]; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "INSERT INTO %[*]SMETADATA_STORE(METADATA_KEY, METADATA_VALUE, REGION) SELECT ?, ?, ? FROM %SMETADATA_STORE WHERE METADATA_KEY=? AND REGION=? HAVING COUNT(*)=0"; expected "identifier"; SQL statement:
INSERT INTO %sMETADATA_STORE(METADATA_KEY, METADATA_VALUE, REGION) SELECT ?, ?, ? FROM %sMETADATA_STORE WHERE METADATA_KEY=? AND REGION=? HAVING COUNT(*)=0 [42001-200]
    at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizer.synchronizeToLocalDirectory(AbstractInboundFileSynchronizer.java:355)
    at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizingMessageSource.doReceive(AbstractInboundFileSynchronizingMessageSource.java:265)
    at org.springframework.integration.file.remote.synchronizer.AbstractInboundFileSynchronizingMessageSource.doReceive(AbstractInboundFileSynchronizingMessageSource.java:66)
    at org.springframework.integration.endpoint.AbstractFetchLimitingMessageSource.doReceive(AbstractFetchLimitingMessageSource.java:45)
    at org.springframework.integration.endpoint.AbstractMessageSource.receive(AbstractMessageSource.java:167)
    at org.springframework.integration.endpoint.SourcePollingChannelAdapter.receiveMessage(SourcePollingChannelAdapter.java:250)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.doPoll(AbstractPollingEndpoint.java:359)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.pollForMessage(AbstractPollingEndpoint.java:328)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.lambda$null(AbstractPollingEndpoint.java:275)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor.lambda$execute[=12=](ErrorHandlingTaskExecutor.java:57)
    at org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)
    at org.springframework.integration.util.ErrorHandlingTaskExecutor.execute(ErrorHandlingTaskExecutor.java:55)
    at org.springframework.integration.endpoint.AbstractPollingEndpoint.lambda$createPoller(AbstractPollingEndpoint.java:272)
    at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
    at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
    at java.base/java.lang.Thread.run(Thread.java:834)

我正在使用 spring boot 提供的默认数据存储 + H2 数据库。

怎么了?

你好,从你的堆栈跟踪中我看到了这个问题:

Syntax error in SQL statement
"INSERT INTO %[*]SMETADATA_STORE(METADATA_KEY,
           METADATA_VALUE, REGION) SELECT ?, ?, ? 
    FROM %SMETADATA_STORE 
    WHERE METADATA_KEY=? AND REGION=? 
    HAVING COUNT(*)=0"; expected "identifier";

您似乎没有正确初始化 table 见 post

我通过使 JdbcMetadataStore 成为一个 bean 来修复它,因此调用了初始化方法...

    @Bean
    fun ftpPersistentAcceptOnceFileListFilter(jdbcMetadataStore: JdbcMetadataStore) =
            FtpPersistentAcceptOnceFileListFilter(jdbcMetadataStore, "inboundFile")

    @Bean
    fun jdbcMetadataStore(dataSource: DataSource) = JdbcMetadataStore(dataSource)