freemarker的读取FTL文件问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了freemarker的读取FTL文件问题相关的知识,希望对你有一定的参考价值。
代码是网上拷的 是这个
import freemarker.template.*;
import java.util.*;
import java.io.*;
public class Test
public static void main(String[] args) throws Exception
/* 一般在应用的整个生命周期中你仅需要执行一下代码一次*/
/* 创建一个合适的configuration */
Configuration cfg = new Configuration();
cfg.setDirectoryForTemplateLoading(new File("/"));
cfg.setObjectWrapper(new DefaultObjectWrapper());
/* 而以下代码你通常会在一个应用生命周期中执行多次*/
/*获取或创建一个模版*/
Template temp = cfg.getTemplate("Test.txt");
/*创建一个数据模型Create a data model */
Map root = new HashMap();
root.put("user", "Big Joe");
Map latest = new HashMap();
root.put("latestProduct", latest);
latest.put("url", "products/greenmouse.html");
latest.put("name", "green mouse");
/* 合并数据模型和模版*/
Writer out = new OutputStreamWriter(System.out);
temp.process(root, out);
out.flush();
错误是下面
Exception in thread "main" java.lang.SecurityException: D:\Test1.ftl resolves to D:\Test1.ftl which doesn't start with D:\\
at freemarker.cache.FileTemplateLoader$2.run(FileTemplateLoader.java:169)
at java.security.AccessController.doPrivileged(Native Method)
at freemarker.cache.FileTemplateLoader.findTemplateSource(FileTemplateLoader.java:156)
at freemarker.cache.TemplateCache.acquireTemplateSource(TemplateCache.java:600)
at freemarker.cache.TemplateCache.findTemplateSource(TemplateCache.java:576)
at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:347)
at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:235)
at freemarker.template.Configuration.getTemplate(Configuration.java:487)
at freemarker.template.Configuration.getTemplate(Configuration.java:452)
at Test1.main(Test1.java:24)
如何从 src/main/resources 文件夹中读取 Freemarker 模板文件?
【中文标题】如何从 src/main/resources 文件夹中读取 Freemarker 模板文件?【英文标题】:How to read Freemarker Template files from src/main/resources folder? 【发布时间】:2015-09-16 00:00:54 【问题描述】:如何从我的代码(Spring Boot 应用程序)访问存储在我的 src/main/resources 文件夹中的 freemarker 模板 (*.ftl) 文件?
我尝试了以下
freemarker.template.Configuration config = new Configuration();
configuration.setClassForTemplateLoading(this.getClass(), "/resources/templates/");
并得到以下异常
freemarker.template.TemplateNotFoundException: Template not found for name "my-template.ftl".
【问题讨论】:
如果您使用开箱即用的 Spring 配置,您实际上不需要执行任何操作。由于 Spring boot 为您配置免费标记,包括解析器。 【参考方案1】:classpath的根是src/main/resources
,把路径改成
configuration.setClassForTemplateLoading(this.getClass(), "/templates/");
【讨论】:
但是如果我们从 jar 文件中运行代码,如何修改代码来适配它呢?比如:java -jar freemarker.jar,在这个jar文件中,templates文件夹位于这个jar包的根目录下。 在这里给更多人一个想法:new ClassTemplateLoader(getClass().getClassLoader(), "templates") new ClassTemplateLoader(getClass(), "/templates") @AlterHu,理想情况下你应该把 src/main/resources 放在你的 jar 文件中。 @Biscuit128 完全同意你的评论:D【参考方案2】:我遇到了“freemarker.template.TemplateNotFoundException: Template not found for name...”问题。 我的代码是正确的,但我忘记在 pom.xml 中包含 /templates/ 目录。所以下面的代码为我解决了这个问题。我希望这有帮助。
AppConfig.java :
@Bean(name="freemarkerConfiguration")
public freemarker.template.Configuration getFreeMarkerConfiguration()
freemarker.template.Configuration config = new freemarker.template.Configuration(freemarker.template.Configuration.getVersion());
config.setClassForTemplateLoading(this.getClass(), "/templates/");
return config;
EmailSenderServiceImpl.java:
@Service("emailService")
public class EmailSenderServiceImpl implements EmailSenderService
@Autowired
private Configuration freemarkerConfiguration;
public String geFreeMarkerTemplateContent(Map<String, Object> dataModel, String templateName)
StringBuffer content = new StringBuffer();
try
content.append(FreeMarkerTemplateUtils.processTemplateIntoString(freemarkerConfiguration.getTemplate(templateName), dataModel));
return content.toString();
catch(Exception exception)
logger.error("Exception occured while processing freeMarker template: ", exception.getMessage(), exception);
return "";
pom.xml :
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources/</directory>
<includes>
<include>templates/*.ftl</include>
</includes>
</resource>
<resource>
<directory>src/main/</directory>
<includes>
<include>templates/*.ftl</include>
</includes>
</resource>
</resources>
</build>
【讨论】:
以上是关于freemarker的读取FTL文件问题的主要内容,如果未能解决你的问题,请参考以下文章
java freemarker 通过ftl模板导出word文档