1
votes

Charger le modèle Freemarker à partir d'une URL externe

J'ai implémenté une application de démarrage de printemps où nous devons envoyer des e-mails à l'aide de freemarker. L'application va être déployée sur le moteur d'application Google, où la structure de fichiers n'est pas disponible pour stocker les modèles. J'ai donc enregistré des modèles sur le stockage Google avec un accès public. Mais impossible de charger dans le moteur de modèle de freemarker.

freeMarkerConfiguration.setDirectoryForTemplateLoading(new File("https://storage.googleapis.com/nixon-medical/"));

           content.append(FreeMarkerTemplateUtils.processTemplateIntoString(
                    freeMarkerConfiguration.getTemplate("Email.html"),model));

Cette configuration ci-dessus fonctionnera sur l'environnement de développement. Mais sur le moteur d'application Google, je n'ai pas de répertoire pour stocker le modèle.

J'ai essayé ceci:

freeMarkerConfiguration.setDirectoryForTemplateLoading(new File("/home/dnilesh/Downloads/helloworld-springboot/src/main/resources/"));

content.append(FreeMarkerTemplateUtils.processTemplateIntoString(
                freeMarkerConfiguration.getTemplate("Email.html"),model));

Mais le freemarker ne charge pas le modèle depuis une URL externe. Comment puis-je charger ceci?


0 commentaires

3 Réponses :


2
votes

Pour les URL externes, vous devez utiliser URLTemplateLoader :

Si la source de votre modèle accède aux modèles via une URL, vous n'avez pas besoin d'implémenter un TemplateLoader à partir de zéro; vous pouvez choisir de sous-classer freemarker.cache.URLTemplateLoader à la place et simplement implémenter la méthode URL getURL (String templateName).

Voir l ' exemple de code


0 commentaires

0
votes

Vous pouvez utiliser un résolveur Thymeleaf pour charger les fichiers externes. https://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring. html


1 commentaires

Merci, mais dans notre projet, nous avons déjà implémenté un modèle de freemarker



0
votes

Bien qu'il y ait une réponse acceptée, je n'ai pas trouvé l'intégration avec Spring Boot. J'ai donc fait ceci

​​J'essayais de lire le modèle Freemarker à partir de Google Cloud Storage avec l'application Spring Boot.

Donc, j'ai fait ce qui suit et cela a fonctionné pour moi.

  • Mettre en œuvre URLTemplateLoader et remplacer uniquement la méthode getURL activée
  • Bean FreeMarkerConfigurer, définir le modèle comme modèle personnalisé

CloudTemplateLoader - mon chargeur personnalisé

@GetMapping
public String index() {
    return "<bucket-name>/index.ftl";
}

}

FreeMarkerConfigurer Bean pour configurer mon chargeur personnalisé

@Bean
public FreeMarkerConfigurer freeMarkerConfigurer() throws MalformedURLException {
    FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
    Properties properties = new Properties();
    properties.setProperty("localized_lookup", "false");
    freeMarkerConfigurer.setFreemarkerSettings(properties);
    freeMarkerConfigurer.setPreTemplateLoaders(new CloudTemplateLoader(new URL("https://storage.googleapis.com")));
    freeMarkerConfigurer.setDefaultEncoding("UTF-8");
    return freeMarkerConfigurer;
}

Et mon contrôleur suit

public class CloudTemplateLoader extends URLTemplateLoader {
private URL root;
public CloudTemplateLoader(URL root) {
    super();
    this.root = root;
}

@Override
protected URL getURL(String template) {
    try {
        return new URL(root,  "/" + template);
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
    return null;
}

N'oubliez pas de télécharger le modèle sur le cloud google ou s3. À des fins de test, j'ai ajouté un accès public à mon fichier index.ftl. entrez la description de l'image ici


0 commentaires