2017-10-09 31 views
1

Spring IntegrationのSFTPセッションファクトリ(Javaコンフィグレーション)を使用する場合、リモートSFTPサーバディレクトリを動的に設定したいと思います。春のドキュメントはこれが可能であると言う:SpringインテグレーションFTP - リモートディレクトリ表現によるダイナミックディレクトリの作成(Java config)

Spring Integration SFTP Adapters

SpeIおよびSFTPアウトバウンドアダプタ

春の統合の多くの他のコンポーネントと同じように、あなたは(春の式言語から に利益をもたらすことができますremote-directory-expressionremote-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 

答えて

0

を実行し、ファイルのアップロードを開始すること。

ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser() 

とこの発現解析のためにそれを使用します:あなたはパーサを宣言する必要があり、その目的のために

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

そして結果Expressionオブジェクトは、各要求メッセージに対して評価されます。

詳細はReference Manualをご覧ください。

+0

問題(https://jira.spring.io/browse/INT)でJIRAを上げることをお勧めします。私たちは 'setRemoteDirectoryExpressionString()'バリアントを提供し、Docsにサンプルを追加する必要があります。確かにそれは初心者のために明白ではない。 –

+1

完了。 [JIRA発行のINT-4356](https://jira.spring.io/browse/INT-4356) –

関連する問題