转载

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

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

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

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

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

很多小伙伴可能很早就接触过 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 就可以了,像下面这张图这样:

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

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

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

spring.freemarker.suffix=.ftl

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

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

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

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

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

好了,一个小小的坑,小伙伴们在这里遇到问题稍稍留意下就可以了。

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

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

1 Spring Boot2 系列教程(一)纯 Java 搭建 SSM 项目

2、 Spring Boot2 系列教程(二)创建 Spring Boot 项目的三种方式

3、 Spring Boot2 系列教程(三)理解 spring-boot-starter-parent

4、 Spring Boot2 系列教程(四)理解配置文件 application.properties !

5、 Spring Boot2 系列教程(五)Spring Boot中的 yaml 配置

6、 Spring Boot2 系列教程(六)自定义 Spring Boot 中的 starter

7、 Spring Boot2 系列教程(七)理解自动化配置的原理

14、 Spring Boot2 系列教程(十四)CORS 解决跨域问题

16、 Spring Boot2 系列教程(十六)定时任务的两种实现方式

21、 Spring Boot2 系列教程(二十一)整合 MyBatis

23、 Spring Boot2 系列教程(二十三)理解 Spring Data Jpa

27、 Spring Boot2 系列教程(二十七)Nginx 极简扫盲入门

33、 Spring Boot2 系列教程(三十三)整合 Spring Security

39、 Spring Boot2 系列教程(三十九)Spring Boot 热部署

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

喜欢就点个 "在看" 呗^_^

原文  http://mp.weixin.qq.com/s?__biz=MzI1NDY0MTkzNQ==&mid=2247487529&idx=2&sn=40fac3ba407d1028929ed0002c79dce3
正文到此结束
Loading...