推荐阅读:
开发十年经验总结,阿里架构师的手写Spring boot原理实践文档
看视频学习困难,这一份Redis实战文档,阿里架构师推荐收藏
一份MyBaits框架PDF文档,阿里架构师直言,Java程序员快收藏吧
正文:
Spring Boot2.2.0 这个版本发布没多久,Spring Boot2.2.1 就出来,看似不太重要的版本,却发生了一个小小变化,导致不少小伙伴掉坑了,我本来也没太在意,但是最近有快十个小伙伴在微信上问这个问题,看来我必须得写篇文章说下了,防止小伙伴们掉坑了。
到底是什么问题呢?其实就是 Freemarker 后缀变化的问题,一开始收到这个问题的时候,我以为就是小伙伴们学习不认真导致的,也没太在意:
![80048a892d7059fefba593b32586bbfe.png](https://i-blog.csdnimg.cn/blog_migrate/205725bb17e4abf6374f89b52cb015ac.jpeg)
![f47f293286435e97f1decfdfd6517ab8.png](https://i-blog.csdnimg.cn/blog_migrate/5c2fffe02b63f93faa8e8df5cd7abb22.jpeg)
结果最近不停有人掉坑,我觉得很有必要给各位小伙伴提个醒。
很多小伙伴可能很早就接触过 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 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 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 就可以了,像下面这张图这样:
![8939686212de81cba4dd48b6f2221dea.png](https://i-blog.csdnimg.cn/blog_migrate/f052f234c18df767bce6c77830a0d646.jpeg)
这样框架就能找到相应的模板文件了。
第二种方案就是 Freemarker 模板的后缀不变,依然是 ftl ,然后我们在 application.properties 中修改默认的后缀配置,如下:
spring.freemarker.suffix=.ftl
这样就是人为强行把 Freemarker 模板的后缀又改回 .ftl 了。
这两种方案都可以解决这个问题。
其实这个问题很简单,只要你看了 FreeMarkerProperties 类的源码,这个问题一下就明了了。
松哥刚开始录 Spring Boot 视频的时候,当时最新版是 2.1.6,后来随着视频录制,Spring Boot 版本一直在变化,视频里一直是跟随最新版录制,不过在讲 Freemarker 这块的时候,还是 2.1.6,所以当时还不存在上面这个问题。虽然问题不存在,但是我在视频中却是带领小伙伴们看了 FreeMarkerProperties 类的源码的,有小伙伴在掉坑之后,就机智的去翻这个类的源码,然后自己顺利的把问题解决了。感觉深得松哥真传,吾心甚慰。
![59a35b04e351409c304f22c252b5ae65.png](https://i-blog.csdnimg.cn/blog_migrate/37c68b05cecadf0abfff6ad3f679c4dc.jpeg)
好了,一个小小的坑,小伙伴们在这里遇到问题稍稍留意下就可以了。
来源:公众号【江南一点雨】