Mar*_*man 2 java spring spring-el spring-integration-sftp
当使用 Spring Integration 的 SFTP 会话工厂(带有 Java 配置)时,我想动态设置远程 SFTP 服务器目录。Spring 文档说这是可能的:
SpEL 和 SFTP 出站适配器
remote-directory-expression与 Spring Integration 中的许多其他组件一样,在配置 SFTP 出站通道适配器时,您可以通过指定两个属性和remote-filename-generator-expression(参见上文)从 Spring 表达式语言 (SpEL) 支持中受益 。表达式求值上下文将以 Message 作为其根对象,从而允许您提供可以根据 Message 中的数据(来自有效负载或headers )动态计算文件名或现有目录路径的表达式。在上面的示例中,我们使用 表达式值定义属性,该表达式值根据原始名称计算文件名,同时附加后缀: - foo。remote-filename-generator-expression
但我在实施这一点时遇到了麻烦。我似乎找不到使用 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);
}
}
Run Code Online (Sandbox Code Playgroud)
要启动文件上传,我执行此代码
@Autowired
private UploadGateway gateway;
byte[] file = "test".getBytes();
path = "mydirectory";
filename = "myfilename";
gateway.upload(file, filename, path); // edited to correct parameter order error
Run Code Online (Sandbox Code Playgroud)
SpEL 表达式可能非常复杂且动态。为此,您必须声明解析器:
ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser()
Run Code Online (Sandbox Code Playgroud)
并将其用于此表达式解析:
handler.setRemoteDirectoryExpression(EXPRESSION_PARSER.parseExpression("headers['path']"));
Run Code Online (Sandbox Code Playgroud)
结果Expression对象将根据每个请求消息进行评估。
请参阅参考手册中的更多信息。
| 归档时间: |
|
| 查看次数: |
8169 次 |
| 最近记录: |