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 类的源码的,出了问题之后,有小伙伴就机智的去翻这个类的源码,然后自己顺利的把问题解决了。感觉深得松哥真传,吾心甚慰。
好了,一个小小的坑,小伙伴们在这里遇到问题稍稍留意下就可以了。