WebMvcConfigurer 与 WebMvcConfigurationSupport避坑指南

我们知道,在Spring Boot 2.0后用自己的的配置类继承WebMvcConfigurerAdapter时,idea会提示这个类已经过时了。

通常情况下我们会采用下面两种代替方案:

  • 实现WebMvcConfigurer
  • 继承WebMvcConfigurationSupport

但是继承WebMvcConfigurationSupport时发现会造成一些问题

在这之前,我们先看一下WebMvc自动配置类WebMvcAutoConfiguration的定义:

注意红框圈起来到这个关键语句:

@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)

看到这行可以明白,原来SpringBoot做了这个限制,只有当WebMvcConfigurationSupport类不存在的时候才会生效WebMvc自动化配置,WebMvc自动配置类中不仅定义了classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/等路径的映射,还定义了配置文件spring.mvc开头的配置信息等。

当 WebMvcAutoConfiguration 不生效时会导致以下几个问题:
1.WebMvcProperties 和 ResourceProperties 失效

因为两个配置类中的属性都在 WebMvcAutoConfiguration 中使用

当WebMvc自动配置失效(WebMvcAutoConfiguration自动化配置)时,会导致无法视图解析器无法解析并返回到对应的视图

解决方案:

1. 在SpringBoot1.X的版本中,我们可以继承自WebMvcConfigurerAdapter,覆盖想要实现的方法即可。

2. 但是在SpringBoot2.X的定义中,WebMvcConfigurerAdapter已经被定义为@Deprecated,我们来看一下源代码:

SpringBoot其实也已经告诉你WebMvcConfigurerAdapter自从Spring5.0版本开始已经不建议使用了,但是你可以实现WebMvcConfigurer并重写相关方法来达到类似的功能。

2.类路径上的 HttpMessageConverter 失效

如:StringHttpMessageConverterConfiguration、MappingJackson2HttpMessageConverter ,因为 HttpMessageConverters 中持有着所有HttpMessageConverter的实例, 在 WebMvcAutoConfigurationAdapter 中会注入 HttpMessageConverters ,因此当 WebMvcAutoConfigurationAdapter 不加载时,则会失效,间接的造成 spring.http.encoding.charset 与 spring.jackson.date-format 假象的失效。

如:StringHttpMessageConverter 会使用 spring.http.encoding.charset 配置, 默认编码为:ISO-8859-1

@Bean
        @ConditionalOnMissingBean
        public StringHttpMessageConverter stringHttpMessageConverter() {
            StringHttpMessageConverter converter = new StringHttpMessageConverter(
                    this.encodingProperties.getCharset());
            converter.setWriteAcceptCharset(false);
            return converter;
        }

解决方案
因为已知的配置类都已通过 @Bean 注册在容器中,那么我们可以在使用 WebMvcConfigurationSupport 时,通过 @Autowired 注入到配置类中,然后替换掉 WebMvcConfigurationSupport 默认的配置即可,如:

@Configuration
public class WebConfiguration extends WebMvcConfigurationSupport {
    @Autowired
    private StringHttpMessageConverter stringHttpMessageConverter;
    @Autowired
    private MappingJackson2HttpMessageConverter httpMessageConverter;
    /**
     * 添加转换器
     */
    @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (int i = 0; i < converters.size(); i++) {
            if (converters.get(i) instanceof StringHttpMessageConverter){
                converters.set(i, stringHttpMessageConverter);
            }
            if (converters.get(i) instanceof MappingJackson2HttpMessageConverter) {
                converters.set(i, httpMessageConverter);
            }
        }
    }
}

也可以根据需求来重新实现。

补充_

WebMvcConfigurer类代码分析:

从EnableWebMvcConfiguration配置类开始,当它注入时父类会注入Spring容器中所有的WebMvcConfigurer类

接着注入RequestMappingHandlerAdapter Bean 它会调用父类的requestMappingHandlerAdapter方法

这个时候获取配置,例如自定义了返回结果Handler, WebMvcConfigurerComposite会遍历调用WebMvcConfigurer实现类的

addReturnValueHandlers方法,会把自定义配置加载到默认的配置中

原文地址:https://www.cnblogs.com/sueyyyy/p/11611676.html

时间: 2024-07-31 01:19:25

WebMvcConfigurer 与 WebMvcConfigurationSupport避坑指南的相关文章

自如租房避坑指南

[自如租房避坑指南] 在北京工作了两年半的时间里,由于工作原因换了3次房,租的都是 自如的房子,选择自如的原因是因为自如省事,该有的东西都有.但是也有些比较坑的地方,这里列举一下,租房的时候需要注意,这样能让你租到一个比较顺心的房子. 不要完全相信自如APP上面标的房屋面积 在我租房的过程中我看过一些自如的房子,发现自如有些房屋的面积是虚标的,有些标示8平米的房子实际可能只有6平米,有时间最好还是实地去看一下,感觉面积合适再租 价格特别便宜的要注意(相对该房子周边来说) 有时候你在自如上看到特别

安装Seafile Server 7.1.3 不完全避坑指南

容易踩的坑 解决依赖关系是安装seafile server的第一个坑. 官方提供的安装包,大部分依赖都已经打包在包里了, 只有seahub依赖的部分Python包,因为使用了C语言,编译安装时必须和Python的版本对应(这也是之前Windows版本必须安装指定版本python的原因),由于无法预知客户端的Python版本,所以无法包含在安装包中. MySQL/Mariadb数据库配置是第二个坑. 有些系统安装的MySQL/Mariadb数据库,默认配置是不允许root用户通过网络连接服务器的,

跳槽找工作避坑指南(2019版)

虽说年前就有很多人在修改简历.刷新简历,但是为了大家心中所谓的年终奖,99.9999%的人都会选择沉默,有一种「明修栈道,暗度陈仓」意味. 拿完了年终奖,过完了春节,老子早TMD的不想干了,终于不用在你「对象是种扣嗖的老板或领导」这里受你这等鸟气了.于是乎,吭哧吭哧的埋头苦写简历,狂撒网,做梦都想有朝一日能出任CEO,迎娶白富美,走上人生的巅峰. 理想是丰满的,现实是残酷的,搞不好,美梦没有做完,就会吃上一记当头一棒,将你打入「绝情谷」谷底.所以,跳槽找工作一定要慎重,慎重,再慎重. 之前也写过

微信小程序避坑指南

如果对小程序还不熟悉,建议先看下另一篇小程序简介 1. 基础库和微信版本对应关系 iOS 客户端版本 基础库版本 6.7.2 2.3.0 6.7.0 2.2.5 6.6.7 2.1.3 6.6.6 2.0.9 6.6.2 1.9.97 6.6.1 1.9.9 6.6.0 1.9.4 6.5.22 1.7.4 6.5.16 1.6.8 6.5.13 1.5.8 6.5.10 1.4.4 6.5.9 1.3.0 6.5.8 1.2.6 Android 客户端版本 基础库版本 6.7.2 2.3.0

android FileObserver的用法与避坑指南

昨天因为项目需要,需要做一个damo,用到了文件监听的功能,所以就使用了FileObserver(文件观察器)这个类,结果就被坑的不行不行的,昨天下班已经身心俱疲,本着跟bug呲牙必报的精神,这里要将这笔账记下,也希望大家以后不会在这上面浪费时间. FileObserver的功能 故名思议,就是监听文件的事件啦,根据官方给出的文档,有以下几种事件的响应,对应不同的事件常量. 常量名 对应事件 ACCESS 打开文件后读取文件的操作 ALL_EVENTS 事件列表中的所有事件 ATTRIB 未明操

博客园写作避坑指南【持续更新】

以下是花了一晚上调格式之后的血泪经验,如果之后有新的发现会持续更新-- 关于英文单词自动断行 如果你和我一样需要写英文博文,你会发现遇到行尾的英文单词全部被拦腰截断,看上去怪怪的. 这是因为博客园默认模板CSS将mainContent设置为word-break:break-all,即强制断行. 好在博客园开放了页面定制CSS代码,我们可以很方便地加入自己的设置来覆盖掉默认设置,只需要在"设置 -> 页面定制CSS代码"中加入以下代码: #mainContent { word-br

Windows 下安装 tensorflow &amp; keras &amp; opencv 的避坑指南!

安装 Anaconda3 关键的一步: conda install pip 下面再去安装各种你需要的包,一般不会再报错. pip install tensorflow-gpu ==1.5.0rc1 pip install -U keras 如果需要安装 theano,则需要先安装它的依赖包,即 conda install mingw libpython pip install -U theano 安装 OpenCV3 (Windows环境): pip install -U opencv-cont

python避坑指南02——logging模块日志重复打印问题

目录 [TOC] 一.问题抛出 python的logging模块是python使用过程中打印日志的利器.我们可以使用logging模块的logger.Handler.formatter对我们的日志进行封装,指定日志输出的路径.格式以及位置.在声明logger的时候可以传一个字符串作为这个logger的标签.一直以为这个logger是以单例对象的设计模式设计的,只要这个标签名是一样的,那么返回的logger就是同一个.在打印日志的时候,想要实现日志分层,定义类如下函数来封装日志打印函数(由于源代码

增删改查下载-避坑指南

最近学习了站在项目整体上去看问题,决定总结一下开发中常见的问题,争取提高代码质量,降低bug率,在看代码时候及时发现问题. 1.下载问题: 1.下载过程就是从数据库查出数据,写在Excel中.在写的时候,一般做法是将查出来的list循环赋值给object,这个时候就要注意了,如果查出来的值时有空值的,就会导致下载失败.问题解决方案:1.赋值时候判断是否为空,为空用空格或者其他符号代替.2.修改脚本.通过nvl修改返回的空值.select nvl(xx字段,'-') from xxtable. 2