使用Spring Integration与SFTP迁移文件时遇空指针异常求助
问题分析
空指针异常出现在AbstractRemoteFileOutboundGateway.getRemoteFilename()方法,原因是你配置的SftpOutboundGateway依赖file_remoteFile和file_renameTo这两个消息头获取远程文件路径,但调用rename()方法时只传递了本地File对象,没有设置对应的消息头,导致SpEL表达式无法解析到值,触发空指针。
解决方案
你需要确保调用网关方法时,正确传递SFTP服务器上的原文件路径和目标路径作为消息头,有两种实现方式:
方式一:通过@Header注解直接传递头参数
修改fileGateway接口,显式声明需要的消息头参数:
@MessagingGateway public interface FileGateway { @Gateway(requestChannel = "moveFiles") void rename(@Header("file_remoteFile") String originalRemotePath, @Header("file_renameTo") String targetRemotePath); }
调用时直接传入SFTP服务器上的原路径和目标路径:
// 示例:将SFTP上的/path/source.txt移动到/path/target/new.txt fileGateway.rename("/path/source.txt", "/path/target/new.txt");
方式二:构建包含头信息的Message对象传递
调整网关方法接收Message类型参数:
@MessagingGateway public interface FileGateway { @Gateway(requestChannel = "moveFiles") void rename(Message<?> message); }
调用时手动构建消息并设置头信息:
String originalRemotePath = "/path/source.txt"; String targetRemotePath = "/path/target/new.txt"; Message<?> message = MessageBuilder.emptyMessage() .setHeader("file_remoteFile", originalRemotePath) .setHeader("file_renameTo", targetRemotePath) .build(); fileGateway.rename(message);
注意事项
- 这里的路径都是SFTP服务器上的远程路径,不是本地文件路径,不要混淆本地File对象和远程文件路径
- 确保
sftpSessionFactory已正确配置,能正常连接到目标SFTP服务器
内容的提问来源于stack exchange,提问作者Wael90
相关产品推荐
相关产品推荐

