Spring Integration FTP – 使用远程目录表达式创建动态目录(Java配置)
使用Spring Integration的SFTP会话工厂(使用Java配置)时,我想动态设置远程SFTP服务器目录。 Spring文档说这是可能的:
Spring Integration SFTP适配器
SpEL和SFTP出站适配器
与Spring Integration中的许多其他组件一样,通过指定两个属性
remote-directory-expression
和remote-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
对象。
请参阅“ 参考手册”中的更多信息。