我已经实现了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加载模板。我该如何加载?
答案 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模板。
因此,我已经完成了以下工作,并且对我有用。
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";
}