如何使用 FreeMarkerConfigurer 配置带有 spring-boot 的 freemarker?

How to configure freemarker with spring-boot with FreeMarkerConfigurer?

我在 spring 启动时配置 freemarker 有问题。 我的应用程序中有下一个代码 class.

    @Bean
public FreeMarkerConfigurer freeMarkerConfigurer() {
    FreeMarkerConfigurer freemarkerConfig = new FreeMarkerConfigurer();
    freemarkerConfig.setTemplateLoaderPath("template");
    freemarkerConfig.setDefaultEncoding("UTF-8");

    Map<String, Object> freemarkerVariables = new HashMap<String, Object>();
    freemarkerVariables.put("layout", freemarkerLayoutDirectives());

    freemarkerConfig.setFreemarkerVariables(freemarkerVariables);
    return freemarkerConfig;
}


@Bean
public ViewResolver viewResolver() {
    FreeMarkerViewResolver viewResolver = new FreeMarkerViewResolver();
    viewResolver.setCache(false);
    viewResolver.setPrefix("");
    viewResolver.setSuffix(".ftl");
    viewResolver.setContentType("text/html; charset=utf-8");
    return viewResolver;
}


@Bean
public Map<String, TemplateModel> freemarkerLayoutDirectives() {
    Map<String, TemplateModel> freemarkerLayoutDirectives = new HashMap<String, TemplateModel>();
    freemarkerLayoutDirectives.put("extends", new ExtendsDirective());
    freemarkerLayoutDirectives.put("block", new BlockDirective());
    freemarkerLayoutDirectives.put("put", new PutDirective());

    return freemarkerLayoutDirectives;
}

我使用此代码配置 freemarker 和 freemarkerLayoutDirectives(继承)

我的模板放在

src/main/webapp/templates

当我在我的本地机器上构建和 运行 应用程序时一切正常,但是当我尝试 运行 相同的 .jar 在 linux 服务器或 Docker(官方 spring docker)我的应用程序在尝试使用下一个错误渲染视图时崩溃:

There was an unexpected error (type=Not Found, status=404).

没有可用的消息

我的控制器代码

    @RequestMapping(path = "/", method = {RequestMethod.GET})
public String homePage(Model model) String name,
                       BindingResult errors
) {

    return "index";
}

您需要确保 FreemarkerConfigurer 知道您的模板位置。首先,我看到您将方法称为 "setTemplateLoaderPath("template")",但是,该文件夹称为 "templates"(复数)。

其次,我认为文件夹路径是相对于您的程序 运行 所在位置(又名工作目录)的,它可以从 IDE 更改为另一个。最好的选择是将模板放在资源文件夹中。这样它们就被打包在 Jar 中,然后它们可以作为类路径资源被引用,无论您 运行 您的程序在哪里(作为可执行 JAR、docker 图像或通过 IDE).

您可以查看这篇文章以获取设置 freemarkerconfigurer 的示例 https://nullbeans.com/spring-boot-freemarker-configuration-example/