[報錯解決]freemarker java.io.FileNotFoundException/TemplateNotFoundException: Template xxx not found.

java.io.FileNotFoundException: Template common/user_menu.ftl not found.

 最開始一直報fileNotFound,後來又報templateNotFound,看了很多文章剛開始一直沒有解決。

根據提示,始終覺得是路徑的問題,我的項目目錄結構如下:

嘗試升級了freemarker版本,仍然未解決

最初在resources目錄下是沒有common文件夾的。

public class FreeMarkerRender extends Render {
    private static final Logger LOGGER = LoggerFactory.getLogger(FreeMarkerRender.class);

    private static FreeMarkerRender freeMarkerRender;

    private static Configuration freemarkerConfiguration;

    static {
        try {
            FreeMarkerConfigurationFactoryBean freeMarkerConfigurationFactoryBean = new FreeMarkerConfigurationFactoryBean();
            freeMarkerConfigurationFactoryBean.setTemplateLoaderPath("classpath:/");
            freeMarkerConfigurationFactoryBean.setPreferFileSystemAccess(false);
            freemarkerConfiguration = freeMarkerConfigurationFactoryBean.createConfiguration();
            LOGGER.info("創建freemarkerConfiguration實例,爲{}", freemarkerConfiguration);
        } catch (Exception ex) {
            LOGGER.error("init freemarkerConfiguration failure ", ex);
        }
    }

    private Map<String, Object> paramMap = Maps.newHashMap();

    public FreeMarkerRender addParam(String name, Object value) {
        paramMap.put(name, value);
        return this;
    }

    public static FreeMarkerRender newRender() {
        if (freeMarkerRender == null) {
            synchronized (FreeMarkerRender.class) {
                if (freeMarkerRender == null) {
                    freeMarkerRender = new FreeMarkerRender();
                }
            }
        }

        return freeMarkerRender;
    }

    @Override
    public String render(String view) {
        try {
            LOGGER.info("view: {}", view);
            LOGGER.info("獲取template:{}", freemarkerConfiguration.getTemplate(view));
            LOGGER.info("參數:{}", paramMap);
            return processTemplateIntoString(freemarkerConfiguration.getTemplate(view), paramMap);
        } catch (Exception ex) {
            LOGGER.error("freemarker render view: {} failure ", view, ex);
            return null;
        }
    }
}
jav.addData("menuHtml", FreeMarkerRender.newRender()
                    .addParam("contentPath", request.getContextPath())
                    .addParam("path", path)
                    .addParam("userModuleList", userModuleList)
                    .addParam("parentList", parentList)
                    .render("common/user_menu.ftl"));

在項目啓動的時候,會初始化freeMarkerConfigurationFactoryBean,會從TemplateLoaderPath加載template,最初我的path爲

("classpath:/WEB-INF/template"),所以它會去這個路徑找模板,但是不知道爲什麼一直找不到,在WEB-INF目錄下面明明有對應的文件,路徑也一致,但是就是提示找不到。

後來我把模板文件複製了一份到resources目錄下面,編譯後發現bin/WEB-INF/classes下面也有模板文件,推測這個文件應該是我剛剛複製到resources目錄下面的模板

這個時候應該是去讀這裏的模板文件,把路徑改成"classpath:/",順利讀取到該模板文件。

模板文件放在WEB-INF下面讀不到,最好放在resources目錄下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章