专栏首页玩转JavaEESpring Boot2 系列教程(四十五)Spring Boot 2.2.0 中的 Bug

Spring Boot2 系列教程(四十五)Spring Boot 2.2.0 中的 Bug

Spring Boot2.2.0 这个版本发布没多久,Spring Boot2.2.1 就出来,看似不太重要的版本,却发生了一个小小变化,导致不少小伙伴掉坑了,我本来也没太在意,但是最近有快十个小伙伴在微信上问这个问题,看来我必须得写篇文章说下了,防止小伙伴们掉坑了。

到底是什么问题呢?其实就是 Freemarker 后缀变化的问题,一开始收到这个问题的时候,我以为就是小伙伴们学习不认真导致的,也没太在意:

结果最近不停有人掉坑,我觉得很有必要给各位小伙伴提个醒。

很多小伙伴可能很早就接触过 Freemarker,这个模板在 SSM 中也可以使用,只不过需要我们自己的配置东西稍微有点多。但是在之前我们使用 Freemarker 时,这个模板文件的后缀是 ftl,所以我们理所当然的认为这是标准后缀。

其实不然。

在 Freemarker 中,还有两个后缀,一个叫做 ftlh,这个用在 HTML 模板中,另一个叫做 ftlx,这个用在 XML 模板中。

Spring Boot2.2.0 之前,Freemarker 模板默认采用的后缀就是 ftl,我们可以看下 FreeMarkerProperties 类的部分源码(Spring Boot2.2.0 之前的版本):

@ConfigurationProperties(
    prefix = "spring.freemarker"
)
public class FreeMarkerProperties extends AbstractTemplateViewResolverProperties {
    public static final String DEFAULT_TEMPLATE_LOADER_PATH = "classpath:/templates/";
    public static final String DEFAULT_PREFIX = "";
    public static final String DEFAULT_SUFFIX = ".ftl";
    private Map<String, String> settings = new HashMap();
    private String[] templateLoaderPath = new String[]{"classpath:/templates/"};
    private boolean preferFileSystemAccess = true;

可以看到,DEFAULT_SUFFIX 变量中定义的 Freemarker 默认的后缀还是 .ftl

从 Spring Boot2.2.0 开始,FreeMarkerProperties 文件内容就发生了变化,最新的 FreeMarkerProperties 文件部分源码如下:

@ConfigurationProperties(
    prefix = "spring.freemarker"
)
public class FreeMarkerProperties extends AbstractTemplateViewResolverProperties {
    public static final String DEFAULT_TEMPLATE_LOADER_PATH = "classpath:/templates/";
    public static final String DEFAULT_PREFIX = "";
    public static final String DEFAULT_SUFFIX = ".ftlh";
    private Map<String, String> settings = new HashMap();
    private String[] templateLoaderPath = new String[]{"classpath:/templates/"};
    private boolean preferFileSystemAccess = true;

可以看到,这个时候在 DEFAULT_SUFFIX 变量中定义的默认后缀变成 .ftlh 了。

就这样一个小小变化,就把很多初次接触 Spring Boot 的小伙伴搞晕啦。

那么这个问题如何解决呢?当大家发现了原因,应该也就能找到解决办法了,其实很简单,两个思路:

  • 将 Freemarker 模板的后缀改为 .ftlh,推荐这种方式
  • 在 application.properties 中修改默认配置

第一种方案,就是我们在定义 Freemarker 模板的时候,直接将原来的 ftl 改成 ftlh 就可以了,像下面这张图这样:

这样框架就能找到相应的模板文件了。

第二种方案就是 Freemarker 模板的后缀不变,依然是 ftl,然后我们在 application.properties 中修改默认的后缀配置,如下:

spring.freemarker.suffix=.ftl

这样就是人为强行把 Freemarker 模板的后缀又改回 .ftl 了。

这两种方案都可以解决这个问题。

其实这个问题很简单,只要你看了 FreeMarkerProperties 类的源码,这个问题一下就明了了。

松哥刚开始录 Spring Boot 视频的时候,当时最新版是 2.1.6,后来随着视频录制,Spring Boot 版本一直在变化,视频里一直是跟随最新版录制,不过在讲 Freemarker 这块的时候,还是 2.1.6,所以当时还不存在上面这个问题。虽然问题不存在,但是我在视频中却是带领小伙伴们看了 FreeMarkerProperties 类的源码的,出了问题之后,有小伙伴就机智的去翻这个类的源码,然后自己顺利的把问题解决了。感觉深得松哥真传,吾心甚慰。

本文分享自微信公众号 - 牧码小子(a_javaboy),作者:江南一点雨

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring Boot2 系列教程(四十二)使用 Jib 部署 Spring Boot

    之前松哥和大家分享过一篇将 Spring Boot 项目部署到远程 Docker 上的文章:

    江南一点雨
  • Spring Boot2 系列教程(三十四)Spring Security 添加验证码

    登录添加验证码是一个非常常见的需求,网上也有非常成熟的解决方案,其实,要是自己自定义登录实现这个并不难,但是如果需要在 Spring Security 框架中实...

    江南一点雨
  • Spring Boot2 系列教程(二十七)Nginx 极简扫盲入门

    上篇文章和大家聊了 Spring Session 实现 Session 共享的问题,有的小伙伴看了后表示对 Nginx 还是很懵,因此有了这篇文章,算是一个 N...

    江南一点雨
  • Spring Boot2 系列教程(十二)@ControllerAdvice 的三种使用场景

    严格来说,本文并不算是 Spring Boot 中的知识点,但是很多学过 SpringMVC 的小伙伴,对于 @ControllerAdvice 却并不熟悉,S...

    江南一点雨
  • Spring Boot2 系列教程(十一)Spring Boot 中的静态资源配置

    当我们使用 SpringMVC 框架时,静态资源会被拦截,需要添加额外配置,之前老有小伙伴在微信上问松哥 Spring Boot 中的静态资源加载问题:“松哥,...

    江南一点雨
  • Spring Boot2 系列教程(四十四)Spring Session 中的 Bug

    真是郁闷,不过这事又一次提醒我解决问题还是要根治,不能囫囵吞枣,否则相同的问题可能会以不同的形式出现,每次都得花时间去搞。刨根问底,一步到位,再遇到类似问题就可...

    江南一点雨
  • Spring Boot2 系列教程(十四)CORS 解决跨域问题

    很多人对跨域有一种误解,以为这是前端的事,和后端没关系,其实不是这样的,说到跨域,就不得不说说浏览器的同源策略。

    江南一点雨
  • Spring Boot2 系列教程(十三)Spring Boot 中的全局异常处理

    在 Spring Boot 项目中 ,异常统一处理,可以使用 Spring 中 @ControllerAdvice 来统一处理,也可以自己来定义异常处理方案。S...

    江南一点雨
  • Spring Boot2 系列教程(五)Spring Boot中的 yaml 配置

    搞 Spring Boot 的小伙伴都知道,Spring Boot 中的配置文件有两种格式,properties 或者 yaml,一般情况下,两者可以随意使用,...

    江南一点雨
  • 一起来学 SpringBoot 2.x | 第十五篇:actuator 与 spring-boot-admin 可以说的秘密

    一起来学SpringBoot | 第十四篇:强大的 actuator 服务监控与管理 中介绍了actuator 的作用,细心的朋友可能会发现通过http res...

    芋道源码
  • Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker

    这是一个相当老牌的开源的免费的模版引擎。通过 Freemarker 模版,我们可以将数据渲染成 HTML 网页、电子邮件、配置文件以及源代码等。Freemark...

    江南一点雨
  • Spring Boot2 系列教程(四十)Spring Boot 可执行 jar 分析

    “松哥,为什么我的 Spring Boot 项目打包成的 jar ,被其他项目依赖之后,总是报找不到类的错误?”

    江南一点雨
  • Spring Boot2 系列教程(三十)Spring Boot 整合 Ehcache

    用惯了 Redis ,很多人已经忘记了还有另一个缓存方案 Ehcache ,是的,在 Redis 一统江湖的时代,Ehcache 渐渐有点没落了,不过,我们还是...

    江南一点雨
  • Spring Boot2 系列教程(十九)Spring Boot 整合 JdbcTemplate

    在 Java 领域,数据持久化有几个常见的方案,有 Spring 自带的 JdbcTemplate 、有 MyBatis,还有 JPA,在这些方案中,最简单的就...

    江南一点雨
  • Spring Boot 2.2.1 发布,一个有点坑的版本!

    Spring Boot 2.2.0 没发布多久,Spring Boot 2.2.1 又发布了,这是一个很有意思,又有点 "坑" 的一个版本。

    Java技术栈
  • springboot系列教程导学篇

    Spring Boot 虽然凯哥从2015年年初开始就接触了spring boot。但是在之后的公司中都没有使用到,来来回回学了好几次了。正好,公司现在准备使用...

    凯哥Java
  • Spring Boot2 系列教程(三十九)Spring Boot 热部署

    Spring Boot 中的热部署相信大家都用过吧,只需要添加 spring-boot-devtools 依赖就可以轻松实现热部署。Spring Boot 中热...

    江南一点雨
  • Spring Boot2 系列教程(三十二)Spring Boot 整合 Shiro

    在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是,仅仅从技术角度来说,也可以使用 Shiro。

    江南一点雨
  • Spring Boot2 系列教程(二十六)Spring Boot 整合 Redis

    本系列第 24、25 两篇文章,分别是 Spring Boot+Jpa 以及 Spring Boot+Jpa 多数据源,不知触发了什么关键字,一直无法发送,找了...

    江南一点雨

扫码关注云+社区

领取腾讯云代金券