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

Spring Boot Integration操作SFTP事务调用rename方法报EL1004E错误咨询

问题根本原因

你使用的SftpStreamingMessageSource是流式传输组件,返回的消息payload是com.jcraft.jsch.ChannelSftp的内部类实现的InputStream对象,而非ChannelSftp实例本身,这个内部类仅实现了流读取相关方法,不存在rename方法,因此SpEL表达式求值失败。

解决方案

首选方案是直接引用你已经配置的SftpRemoteFileTemplate Bean执行重命名操作,不需要依赖payload:

修正后的代码

@Bean
public TransactionSynchronizationFactory transactionSynchronizationFactory(){
    ExpressionEvaluatingTransactionSynchronizationProcessor processor = new ExpressionEvaluatingTransactionSynchronizationProcessor();
    SpelExpressionParser spelParser = new SpelExpressionParser();
    // 直接引用注册的sftpRemoteFileTemplate Bean执行重命名
    processor.setAfterCommitExpression(spelParser.parseRaw(
            "@sftpRemoteFileTemplate.rename(headers['file_remoteDirectory']+'/'+headers['file_remoteFile'] ,headers['file_remoteDirectory']+'/'+headers['file_remoteFile']+'.PASSED')"));
    processor.setAfterRollbackExpression(spelParser.parseRaw(
            "@sftpRemoteFileTemplate.rename(headers['file_remoteDirectory']+'/'+headers['file_remoteFile'] ,headers['file_remoteDirectory']+'/'+headers['file_remoteFile']+'.FAILED')"));
    return new DefaultTransactionSynchronizationFactory(processor);
}

注意:如果你的SftpRemoteFileTemplate Bean自定义了名称,替换表达式中@sftpRemoteFileTemplate的sftpRemoteFileTemplate为对应的Bean名即可。

备选方案(非流式场景)

如果你不需要使用流式传输处理大文件,可以将SftpStreamingMessageSource替换为普通的SftpInboundFileSynchronizingMessageSource,该组件会先将远程文件同步到本地磁盘,payload为本地File对象,即可直接使用官方文档示例中的payload.renameTo写法执行本地文件重命名,适合小文件处理场景。


内容的提问来源于stack exchange,提问作者Stadmina

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 20:54:06