专栏首页玩转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 条评论
登录 后参与评论

相关文章

  • 关于springboot自动注入出现Consider defining a bean of type 'xxx' 问题解决方案

    搭建完spring boot的demo后自然要实现自动注入来体现spring ioc的便利了,但是我在实施过程中出现了这么一个问题,见下面,这里找到解决办法记录...

    似水的流年
  • Spring中FactoryBean的作用和实现原理

    BeanFactory与FactoryBean,相信很多刚翻看Spring源码的同学跟我一样很好奇这俩货怎么长得这么像,分别都是干啥用的。BeanFactory...

    奋斗蒙
  • 【极客世界】架构到底是指什么?

    对于技术人员来说,“架构”是一个再常见不过的词了。我们会对新员工培训整个系统的架构,参加架构设计评审,学习业界开源系统(例如,MySQL、Hadoop)的架构,...

    用户3894598
  • 走进Java接口测试之从0到1搭建数据驱动框架(完结篇)

    在前面的几篇文章中,我们介绍了从需求到设计,再到部分功能实现,本篇作为完结篇,我们一起来完成剩下的功能实现,主要为日志管理和性能监控以及有同学提出测试用例多参数...

    高楼Zee
  • 用IDEA详解Spring中的IoC和DI(挺透彻的,点进来看看吧)

    控制反转(IoC)是一个比较抽象的概念,它主要用来消减计算机程序的耦合问题,是Spring框架的核心。 依赖注入(DI)是IoC的另外一种说法,只是从不同的角度...

    泰斗贤若如
  • MyBatis TypeHandler的注册和使用流程分析

    所有的TypeHandler都统一的注册到TypeHandlerRegistry中,其中分别保存了JdbcType对应的TypeHandler(低优先级),对象...

    十毛
  • Spring同时支持Json和Xml

    十毛
  • Spring创始人Rod Johnson:Spring为什么有今天的地位?

    在Spring作为关键词出现在每一位技术人员简历里面的今天,我们可以深刻地体会到Spring的春天真的来了。

    老九君
  • 江帅帅:Spring Boot 应用&amp;底层源码级深度探索系列 02 - 自动配置的底层逻辑

    江帅帅,微信公众号【江帅帅】作者 ,擅长系统架构设计,大数据,运维、机器学习等技术领域;对大中后台技术有丰富经验(交易平台、基础服务、智能客服、基础架构、智能运...

    musicml
  • SpringMVC访问出错No converter found for return value of type

    在使用SSM整合的时候,spring mvc 添加@ResponseBody的时候,正常情况下都会返回json的。但是又的时候如果没有配置好的话,如果想要返回M...

    凯哥Java

扫码关注云+社区

领取腾讯云代金券