【问题标题】:Load Freemarker Template from External Url从外部 URL 加载 Freemarker 模板
【发布时间】:2019-10-28 01:10:55
【问题描述】:

我已经实现了 spring boot 应用程序,我们需要使用 freemarker 发送电子邮件。 应用程序将部署在谷歌应用程序引擎上,其中文件结构无法存储模板。因此,我将模板保存在可公开访问的 Google 存储中。但无法在 freemarker 模板引擎中加载。

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

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

以上配置适用于开发环境。但是在谷歌应用引擎上我没有目录来存储模板。

我试过这个:

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

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

但是 freemarker 没有从外部 URL 加载模板。这个怎么加载?

【问题讨论】:

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


    【解决方案1】:

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

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

    code sample

    【讨论】:

      【解决方案2】:

      虽然有一个公认的答案,但我没有找到与 spring boot 的集成。所以我做了这个

      我正在尝试使用 Spring Boot 应用程序从谷歌云存储中读取 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 cloud 或 s3。出于测试目的,我在 index.ftl 文件中添加了公共访问权限。

      【讨论】:

      • 感谢分享!
      【解决方案3】:

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

      【讨论】:

      • 谢谢,但在我们的项目中,我们已经实现了 freemarker 模板
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-12-04
      • 2013-03-18
      • 2011-05-11
      • 2019-11-11
      • 2019-11-19
      • 1970-01-01
      • 2010-09-26
      相关资源
      最近更新 更多