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); }
注意:如果你的
SftpRemoteFileTemplateBean自定义了名称,替换表达式中@sftpRemoteFileTemplate的sftpRemoteFileTemplate为对应的Bean名即可。
备选方案(非流式场景)
如果你不需要使用流式传输处理大文件,可以将SftpStreamingMessageSource替换为普通的SftpInboundFileSynchronizingMessageSource,该组件会先将远程文件同步到本地磁盘,payload为本地File对象,即可直接使用官方文档示例中的payload.renameTo写法执行本地文件重命名,适合小文件处理场景。
内容的提问来源于stack exchange,提问作者Stadmina
相关产品推荐
相关产品推荐

