2017-10-09 204 views
1

当使用Spring Integration的SFTP会话工厂(使用Java配置)时,我想动态设置远程SFTP服务器目录。 Spring的文档说,这是可能的:Spring集成FTP - 使用远程目录表达式(Java配置)创建动态目录

Spring Integration SFTP Adapters

规划环境地政司和SFTP出站适配器

如同在Spring集成许多其他组件,您可以从Spring表达式语言受益 (通过指定两个属性 remote-directory-expressionremote-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 

回答

0

使用SpEL表达式可以是非常复杂的,动态的。 为了这个目的必须声明解析器:

ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser() 

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

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

而结果Expression对象将针对每个请求消息进行评估。

查看更多的信息在Reference Manual

+0

嗯,我建议你就此问题提出一个JIRA(https://jira.spring.io/browse/INT),并且我们必须提供'setRemoteDirectoryExpressionString()'变体并在Docs中添加一个示例。对于新手来说,这确实不明显。 –

+1

完成。 [JIRA问题INT-4356](https://jira.spring.io/browse/INT-4356) –