Spring Integration FTP – 使用远程目录表达式创建动态目录(Java配置)

使用Spring Integration的SFTP会话工厂(使用Java配置)时,我想动态设置远程SFTP服务器目录。 Spring文档说这是可能的:

Spring Integration SFTP适配器

SpEL和SFTP出站适配器

与Spring Integration中的许多其他组件一样,通过指定两个属性remote-directory-expressionremote-filename-generator-expression ,您可以在配置SFTP出站通道适配器时受益于Spring Expression Language(SpEL)支持(参见上文) 。 表达式评估上下文将使用Message作为其根对象,从而允许您提供可以根据Message中的数据(来自有效负载标头 )动态计算文件名或现有目录路径的表达式。 在上面的示例中,我们使用表达式值定义remote-filename-generator-expression属性,该表达式值根据其原始名称计算文件名 ,同时还附加后缀: – foo

但我实施这个问题很麻烦。 我似乎无法找到一个使用Spring的SpEL表达式语言的好例子。 下面的代码可以工作,并将我的文件发送到下面的根目录,或者如果我在LiteralExpression中输入一个特定的目录。 但我想将LiteralExpression表达式替换为使用“path”标题的SpelExpression,类似于我对“file”标题所做的操作,它动态调整正在上传的文件名。

 @Configuration public class SftpConfig { @Autowired private SftpSettings sftpSettings; @Bean public SessionFactory sftpSessionFactory() { DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true); factory.setHost(sftpSettings.getHostname()); factory.setPort(sftpSettings.getPort()); factory.setUser(sftpSettings.getUsername()); factory.setPassword(sftpSettings.getPassword()); factory.setAllowUnknownKeys(true); return new CachingSessionFactory(factory); } @Bean @ServiceActivator(inputChannel = "toSftpChannel") public MessageHandler handler() { SftpMessageHandler handler = new SftpMessageHandler(sftpSessionFactory()); handler.setAutoCreateDirectory(true); // automatically create the remote directory handler.setRemoteDirectoryExpression(new LiteralExpression("")); handler.setFileNameGenerator(new FileNameGenerator() { @Override public String generateFileName(Message message) { return (String) message.getHeaders().get("filename"); } }); return handler; } @MessagingGateway public interface UploadGateway { @Gateway(requestChannel = "toSftpChannel") void upload(@Payload byte[] file, @Header("filename") String filename, @Header("path") String path); } } 

要启动文件上载,我执行此代码

 @Autowired private UploadGateway gateway; byte[] file = "test".getBytes(); path = "mydirectory"; filename = "myfilename"; gateway.upload(file, filename, path); // edited to correct parameter order error 

SpEL表达式可能非常复杂和动态。 为此,您必须声明解析器:

 ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser() 

并将其用于此表达式解析:

 handler.setRemoteDirectoryExpression(EXPRESSION_PARSER.parseExpression("headers['path']")); 

并且将针对每个请求消息评估结果Expression对象。

请参阅“ 参考手册”中的更多信息。