2017-10-09 202 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) –