Spring IntegrationのSFTPセッションファクトリ(Javaコンフィグレーション)を使用する場合、リモートSFTPサーバディレクトリを動的に設定したいと思います。春のドキュメントはこれが可能であると言う:SpringインテグレーションFTP - リモートディレクトリ表現によるダイナミックディレクトリの作成(Java config)
Spring Integration SFTP Adapters
SpeIおよびSFTPアウトバウンドアダプタ
春の統合の多くの他のコンポーネントと同じように、あなたは(春の式言語から に利益をもたらすことができます
remote-directory-expression
とremote-filename-generator-expression
(上記を参照)を指定して、 SFTPアウトバウンドチャネルアダプタを設定するときは、SpELをサポートします。式評価コンテキストのいずれかから(したがって、あなたは 動的メッセージ内のデータに をベースファイル名または既存のディレクトリパスを計算できる式を提供することができ、そのルートオブジェクトとしてメッセージ を持っていますペイロードまたはヘッダー)。 FOO - : の例では、我々はまた、接尾辞を追加しながら、元の名前に をベースファイル名を計算式の値を持つremote-filename-generator-expression
属性を定義している上に。
しかし、これを実装する際に問題が発生しています。私はSpringのSpEL式言語を使った良い例を見つけることができません。以下のコードは動作し、私のファイルを下のようにルートディレクトリに、またはLiteralExpressionに入力すれば特定のディレクトリに送信します。しかし、 "path"ヘッダーを使用するSpelExpressionを使ってLiteralExpression式を交換したいと思います。アップロードするファイル名を動的に調整する "file"ヘッダーで行ったことと同様です。
@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);
}
}
SPEL式は本当に複雑で動的することができ、私はこのコード
@Autowired
private UploadGateway gateway;
byte[] file = "test".getBytes();
path = "mydirectory";
filename = "myfilename";
gateway.upload(file, filename, path); // edited to correct parameter order error
問題(https://jira.spring.io/browse/INT)でJIRAを上げることをお勧めします。私たちは 'setRemoteDirectoryExpressionString()'バリアントを提供し、Docsにサンプルを追加する必要があります。確かにそれは初心者のために明白ではない。 –
完了。 [JIRA発行のINT-4356](https://jira.spring.io/browse/INT-4356) –