终于搞懂@EnableWebMvc,WebMvcConfigurer和WebMvcConfigurationSupport的机制了

Spring-Boot约定优于配置好是挺好的,但有时候也挺坑的,就比如我最近遇到的这个问题。因为项目需要加一个自定义的HandlerMethodReturnValueHandler来处理成统一的响应结果。网上一搜,有些博客会告诉你实现WebMvcConfigurer接口然后加上@Configuration和@EnbleWebMvc注解,有些博客又是另一种方式,让你直接继承WebMvcConfigurerAdapter或者继承WebMvcConfigurationSupport又或者继承DelegatingWebMvcConfiguration。各有各的说法,好像都能实现,又好像都会导致其他的问题,比如这个swagger突然就访问不了,或者Pageable突出就解析不了了等等。

这时候你可能会跟我一样,去瞅瞅这几个类的javadoc看看官方是怎么说的。然后你会发现,官方也是这么说的“大部分情况你只要实现WebMvcConfigurer接口你所需要实现的方法,然后加上@Configuration,然后其中一个类加上@EnbleWebMvc注解就可以了,当实现接口不能满足你的需求时确实是可以考虑继承WebMvcConfigurationSupport的”。那么问题到底出在什么地方呢?

问题就出在Spring-Boot的自动配置。前面的这些机制都是spring-webmvc这个jar提供的,如果没有自动配置,确实上面的方法都不会有问题(严格来说也不算问题,只是你不明白发生了什么而已)。而一旦你引入了spring-boot-autoconfigure,你就不能再按上面的说法去做了。

我来详细解释一下这里面的关系。首先spring-webmvc的机制是没有问题的,在不引入spring-boot-autoconfigure这个自动配置包的情况下,我们配置好swagger之后实际上是访问不到swagger的页面的,因为swagger本身以及我们自己都没有向spring注册相应的ResourceHandler。我们使用spring-boot之所以能访问到swagger-ui.html,是因为spring-boot-autoconfigure包中的WebMvcAutoConfiguration这个类。


image.png

上面这段代码来自WebMvcAutoConfiguration中的内部配置类WebMvcAutoConfigurationAdapter,就是它注册了/**的ResouceHandler让我们能够访问的classpath下面的swagger-ui.html。这一切本来都挺好的,问题的源头就出在WebMvcAutoConfiguration上面的一个注解:


image.png

意思是只有不存在WebMvcConfigurationSupport这个类型的bean时,这一大堆自动配置才会生效。而spring-webmvc推荐的使用@EnableWebMvc会自动引入DelegatingWebMvcConfiguration这个WebMvcConfigurationSupport的子类来加载所有实现了WebMvcConfigurer接口的Configuration,和直接继承WebMvcConfigurationSupport的效果一样都会导致自动配置失效。你说这能怪谁?怪spring-webmvc?人家单独开发写文档的时候又怎么会想到你autoconfigure会这么搞?怪autoconfigure?人家确实也是在尽可能让你既可以使用自动配置,又可以覆盖自动配置。只是你不会用而已,你只需要实现WebMvcConfigurer接口加上@Configuration就可以了,千万别加@EnableWebMvc。要怪只能怪你,没看源码罗!哈哈~~滑天下之大稽。我他喵搞了一整天才找到这个根源。

另外顺便提一嘴,别傻乎乎地真的去直接继承WebMvcConfigurationSupport,起码也应该是继承它的子类DelegatingWebMvcConfiguration,因为里面包含了加载所有实现了WebMvcConfigurer接口的Configuration。比如上面提到的Pageable失效就是因为直接继承WebMvcConfigurationSupport导致的SpringDataWebConfiguration这个配置没有被加载。
唉,难怪常看到“Spring Boot sucks”这样的字眼。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,504评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,434评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,089评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,378评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,472评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,506评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,519评论 3 413
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,292评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,738评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,022评论 2 329
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,194评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,873评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,536评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,162评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,413评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,075评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,080评论 2 352

推荐阅读更多精彩内容

  • springboot原理 未使用springboot时,怎样构建web项目(ssm架构的) 导入web及其配置,s...
    幻如常阅读 331评论 0 0
  • 1、简介 使用Spring Boot: (1)、创建Spring Boot应用,添加需要的模块; (2)、Spri...
    木石前盟Caychen阅读 1,188评论 0 6
  • 今天, 同事来找, 有个需求, 大概是这样子, 想用crontab shell方式跑我们现在的SpringBoot...
    it_true阅读 916评论 0 0
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,532评论 28 53
  • 人工智能是什么?什么是人工智能?人工智能是未来发展的必然趋势吗?以后人工智能技术真的能达到电影里机器人的智能水平吗...
    ZLLZ阅读 3,770评论 0 5