SftpOutboundGateway如何动态传递localDirectory参数
SftpOutboundGateway如何动态传递localDirectory参数
嘿,这个需求完全可以实现!我给你分享两种实用的方案,帮你动态传递本地下载目录,不用再把路径写死啦:
方案一:通过消息头传递本地目录
这种方式适合把远程文件路径和本地目录分开作为参数传递,步骤很简单:
- 首先修改你的
TestGateway接口,新增一个参数用来接收本地目录,并用@Header注解把它放到消息头里:
@MessagingGateway public interface TestGateway{ @Gateway(requestChannel = "channel") File getFile(@Payload String filePath, @Header("localDirectory") String localDirectory); }
- 然后更新
SftpOutboundGateway的配置,把固定的setLocalDirectory改成用SpEL表达式动态读取消息头里的目录值:
@Bean @ServiceActivator(inputChannel = "channel") public MessageHandler handler() { SftpOutboundGateway handler = new SftpOutboundGateway(sftpSessionFactory(), "get", "payload"); // 用SpEL表达式从消息头中获取动态的本地目录 handler.setLocalDirectoryExpression(new ValueExpression("#headers['localDirectory']")); // 可选:自动创建不存在的本地目录,避免报错 handler.setAutoCreateLocalDirectory(true); return handler; }
调用的时候直接传两个参数就行:
File downloadedFile = testGateway.getFile("/remote/server/file.txt", "/your/local/download/folder");
方案二:通过自定义请求对象传递参数
如果希望把远程路径和本地目录封装成一个对象传递(更规整),可以试试这种方式:
- 先定义一个包含两个属性的请求类:
public class SftpDownloadRequest { private String remoteFilePath; private String localDirectory; // 构造器、Getter和Setter方法 public SftpDownloadRequest(String remoteFilePath, String localDirectory) { this.remoteFilePath = remoteFilePath; this.localDirectory = localDirectory; } // Getter方法省略,按需添加 }
- 修改
TestGateway接口,接收这个自定义对象作为参数:
@MessagingGateway public interface TestGateway{ @Gateway(requestChannel = "channel") File getFile(SftpDownloadRequest downloadRequest); }
- 最后更新
SftpOutboundGateway的配置,用SpEL分别读取对象里的远程路径和本地目录:
@Bean @ServiceActivator(inputChannel = "channel") public MessageHandler handler() { // 从请求对象中读取远程文件路径 SftpOutboundGateway handler = new SftpOutboundGateway(sftpSessionFactory(), "get", "payload.remoteFilePath"); // 从请求对象中读取动态本地目录 handler.setLocalDirectoryExpression(new ValueExpression("#payload.localDirectory")); handler.setAutoCreateLocalDirectory(true); return handler; }
调用时创建请求对象即可:
SftpDownloadRequest request = new SftpDownloadRequest("/remote/server/file.txt", "/your/local/download/folder"); File downloadedFile = testGateway.getFile(request);
这两种方案都能完美实现动态传递本地目录的需求,你可以根据自己的代码风格选一种就行~
备注:内容来源于stack exchange,提问作者adolzi
相关产品推荐
相关产品推荐

