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)

参考技术A cfg.getTemplate("") 中是你的模板文件, 后缀名 是 ftl。

如何从 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文档

Freemarker 模板从路径 WEB-INF\ftl\ 访问 Freemarker 文件

freemarker设置模板路径问题

ftl文件 是啥文件

FTL(FreeMarker)基础

eclipse配置freemarker,*.ftl文件