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?
3 Réponses :
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
Vous pouvez utiliser un résolveur Thymeleaf pour charger les fichiers externes. https://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring. html
Merci, mais dans notre projet, nous avons déjà implémenté un modèle de freemarker
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.
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.