2017-10-09 7 views
1

Lors de l'utilisation de SFTP Session Factory de Spring Integration (avec la configuration Java), je voudrais définir dynamiquement le répertoire distant du serveur SFTP. Le printemps docs disent que cela est possible:Spring Integration FTP - Créer un répertoire dynamique avec expression de répertoire distant (Java config)

Spring Integration SFTP Adapters

Spel et l'adaptateur sortant SFTP

Comme beaucoup d'autres composants Spring Integration, vous pouvez bénéficier de la langue d'expression de printemps (SpEL) prend en charge lors de la configuration d'un adaptateur de canal sortant SFTP, en spécifiant deux attributs remote-directory-expression et remote-filename-generator-expression (voir ci-dessus). Le contexte d'évaluation d'expression aura le message comme objet racine, vous permettant ainsi de fournir des expressions qui peuvent calculer dynamiquement le nom du fichier ou le chemin du répertoire existant base sur les données contenues dans le message (soit à partir de charge utile ou en-têtes). Dans le exemple ci-dessus, nous définissons l'remote-filename-generator-expression attribut avec une valeur d'expression qui calcule le nom du fichier basé sur son nom d'origine, tout en ajoutant un suffixe: - foo.

Mais j'ai des problèmes pour l'implémenter. Je n'arrive pas à trouver un bon exemple qui utilise le langage d'expression SpEL de Spring. Le code ci-dessous fonctionne et envoie mes fichiers au répertoire racine tel qu'il est ci-dessous, ou un répertoire spécifique si j'en ai entré un dans LiteralExpression. Mais je voudrais échanger l'expression LiteralExpression avec une SpelExpression qui utilise l'en-tête "path", similaire à ce que j'ai fait avec l'en-tête "file" qui ajuste dynamiquement le nom du fichier à télécharger.

@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); 
} 
} 

Pour lancer le téléchargement de fichier j'exécuter ce code

@Autowired 
private UploadGateway gateway; 

byte[] file = "test".getBytes(); 
path = "mydirectory"; 
filename = "myfilename"; 
gateway.upload(file, filename, path); // edited to correct parameter order error 

Répondre

0

L'expression Spel peut être très complexe et dynamique. A cet effet, vous devez déclarer analyseur:

ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser() 

et de l'utiliser pour cette analyse d'expression:

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

Et l'objet résultat Expression sera évaluée par rapport à chaque message de demande.

Voir plus d'informations dans le Reference Manual.

+0

Eh bien, je vous suggère d'élever un JIRA sur le sujet (https://jira.spring.io/browse/INT) et nous devons fournir la variante 'setRemoteDirectoryExpressionString()' et ajouter un échantillon dans les documents. Ce n'est en effet pas évident pour les débutants. –

+1

Terminé. [Numéro JIRA INT-4356] (https://jira.spring.io/browse/INT-4356) –