Spring集成FTP - 使用远程目录表达式(Java配置)创建动态目录
当使用Spring Integration的SFTP会话工厂(使用Java配置)时,我想动态设置远程SFTP服务器目录。 Spring的文档说,这是可能的:Spring集成FTP - 使用远程目录表达式(Java配置)创建动态目录
Spring Integration SFTP Adapters
规划环境地政司和SFTP出站适配器
如同在Spring集成许多其他组件,您可以从Spring表达式语言受益 (通过指定两个属性
remote-directory-expression
和remote-filename-generator-expression
(请参见上文),配置 SFTP出站通道适配器时支持SpEL)。表达式求值上下文将具有消息 作为它的根对象,从而允许你提供一种能够 动态地计算所述文件名或现有目录路径基于在消息中的数据 表达式(无论是从有效载荷或标头)。在 例如上面我们所定义的remote-filename-generator-expression
属性与计算上的原始名称基于 ,同时还附加一个后缀文件名表达式值: - FOO。
但我遇到了麻烦实施这一点。我似乎无法找到一个使用Spring SpEL表达式语言的好例子。下面的代码起作用,并将我的文件发送到根目录下面,或者如果我在LiteralExpression中输入一个文件,则将它发送到特定的目录。但是我想用一个使用“路径”标题的SpelExpression替换LiteralExpression表达式,类似于我用“文件”标题所做的动态调整要上传的文件名。
@Configuration
public class SftpConfig {
@Autowired
private SftpSettings sftpSettings;
@Bean
public SessionFactory<LsEntry> 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<LsEntry>(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
对象将针对每个请求消息进行评估。
查看更多的信息在Reference Manual。
嗯,我建议你就此问题提出一个JIRA(https://jira.spring.io/browse/INT),并且我们必须提供'setRemoteDirectoryExpressionString()'变体并在Docs中添加一个示例。对于新手来说,这确实不明显。 –
完成。 [JIRA问题INT-4356](https://jira.spring.io/browse/INT-4356) –