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

时间:2017-10-09 15:29:07

标签: java spring spring-el spring-integration-sftp

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

Spring Integration SFTP Adapters

  

SpEL和SFTP出站适配器

     

与Spring Integration中的许多其他组件一样,您可以从中受益   从配置的Spring表达式语言(SpEL)支持   SFTP出站通道适配器,通过指定两个属性   remote-directory-expressionremote-filename-generator-expression   (往上看)。表达式评估上下文将具有Message   作为其根对象,从而允许您提供可以的表达式   动态计算文件名或现有的 目录路径   消息中的数据(来自有效负载标头)。在里面   上面的示例我们定义了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

1 个答案:

答案 0 :(得分:2)

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

ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser()

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

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

将针对每条请求消息评估结果Expression对象。

查看Reference Manual中的更多信息。