从外部网址加载Freemarker模板

时间:2019-06-13 12:29:28

标签: google-app-engine google-cloud-storage freemarker template-engine

我已经实现了spring boot应用程序,我们需要使用freemarker发送电子邮件。 App即将部署在Google App Engine上,该文件结构不可用于存储模板。因此,我将模板保存在具有公共访问权限的Google存储设备上。但是无法加载到freemarker模板引擎中。

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

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

以上配置可在开发环境中使用。但是在Google App Engine上,我没有目录来存储模板。

我尝试过:

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

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

但是freemarker无法从外部URL加载模板。我该如何加载?

3 个答案:

答案 0 :(得分:2)

对于外部URL,您应该使用URLTemplateLoader

  

如果模板源通过URL访问模板,则无需从头开始实现TemplateLoader;您可以选择子类化freemarker.cache.URLTemplateLoader,而仅实现URL getURL(String templateName)方法。

请参见code sample

答案 1 :(得分:0)

您可以使用Thymeleaf解析器加载外部文件。 https://www.thymeleaf.org/doc/tutorials/2.1/thymeleafspring.html

答案 2 :(得分:0)

尽管有一个可接受的答案,但我没有发现与Spring Boot的集成。所以我做到了

我正尝试使用Spring Boot应用程序从Google云存储中读取Freemarker模板。

因此,我已经完成了以下工作,并且对我有用。

  • 实施URLTemplateLoader并仅覆盖getURL方法On
  • FreeMarkerConfigurer bean,将pretemplate设置为自定义模板

CloudTemplateLoader-我的自定义加载器

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

}

FreeMarkerConfigurer Bean设置我的自定义加载程序

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

我的控制器正在跟踪

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

不要忘记将模板上传到Google云端或s3。出于测试目的,我在index.ftl文件中添加了公共访问权限。 enter image description here