當使用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
嗯,我建議你就此問題提出一個JIRA(https://jira.spring.io/browse/INT),並且我們必須提供'setRemoteDirectoryExpressionString()'變體並在Docs中添加一個示例。對於新手來說,這確實不明顯。 –
完成。 [JIRA問題INT-4356](https://jira.spring.io/browse/INT-4356) –