一次SpringBoot版本升级,引发的血案
前言
最近项目组升级了SpringBoot版本,由之前的2.0.4升级到最新版本2.7.5,却引出了一个大Bug。
到底是怎么回事呢?
1.案发现场
有一天,项目组的同事反馈给我说,我之前有个接口在新的测试环境报错了,具体异常是:Missing argment level for method parameter of type Integer。
我当时的第一反应有点懵,心想这个接口是一个老接口,有一年多的时间都没改过了,怎么会出问题呢?
他说近期另外一个同事为了部署阿里云服务器,把新测试环境SpringBoot的版本升级到了最新版。
之后,在测试的过程中,发现我有个Get请求接口报异常了。
该接口代码类似于这样:

在getCategory接口中,有两个参数:
- type表示大类,是必传的。
- level表示要返回几级分类,比如:4级分类,就传4,是非必传的,默认就是查4级分类。
就是这样一个接口的level参数,前端没有传参,例如:

结果被Spring MVC拦截直接报错了。
2 报错的原因
从打印的异常信息看,现在level参数必须要传值了,之前是可传,可不传的。
我后来本打算自定义Spring的转换器,修改一下校验规则,跟老版本保持一致。
这样那些基本接口就不用改了。
但后来发现,被spring-web-5.3.23的源码无情的打脸了。
在org.springframework.web.method.annotation包下的AbstractNamedValueMethodArgumentResolver类的resolveArgument方法中:

多了这样的校验。如果该参数为空,没有设置默认值,required属性为true,并且不是Optional类型,则执行handleMissingValueAfterConversion方法。

该方法会调用handleMissingValue方法,具体代码如图中所示:

最后会抛出之前我看到的那个异常。
原因最新版本的Spring中不允许Get接口的请求参数,在不使用@RequestParam注解时,值为空的情况出现了。
3 如何解决问题?
想要解决上面的报错问题,其实很简单,只需在level参数前加@RequestParam注解,并且设置required属性为false。
例如:

但是后面发现,项目中不只我这一个接口要调整,其他好多同事的接口,也有类似的问题,需要修改的接口很多。
这个改动的工作量不小。
哭晕在测试。。。
后话
很多人中招,所以非常有必要把这个问题分享给大家,防微杜渐。
我之前level参数不加@RequestParam注解,也没设置required属性,当时持有的心态是Spring有默认值,有些注解不加程序也能正常运行,既然这样就可以少写点代码,并且在当时的版本测试过,没有出现过什么问题。
这种情况其实是Spring框架的一个bug,已经在最新版本中被修复了。。。
赶紧review一下你们的代码,看看有没有类似的用法,不然迟早有一天也会中招。
一次SpringBoot版本升级,引发的血案的更多相关文章
- 一个无锁消息队列引发的血案(三)——地:q3.h 与 RingBuffer
目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...
- [WCF]缺少一行代码引发的血案
这是今天作项目支持的发现的一个关于WCF的问题,虽然最终我只是添加了一行代码就解决了这个问题,但是整个纠错过程是痛苦的,甚至最终发现这个问题都具有偶然性.具体来说,这是一个关于如何自动为服务接口(契约 ...
- dubbox微服务实例及引发的“血案”
Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成. 主要核心部件: Remoting: 网络通信框架 ...
- Integer.parseInt 引发的血案
Integer.parseInt 处理一个空字符串, 结果出错了, 程序没有注意到,搞了很久, 引发了血案啊!! 最后,终于 观察到了, 最后的部分: Caused by: java.lang.NoC ...
- Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
- Replication的犄角旮旯(七)-- 一个DDL引发的血案(下)(聊聊logreader的延迟)
<Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...
- 转:一个Sqrt函数引发的血案
转自:http://www.cnblogs.com/pkuoliver/archive/2010/10/06/1844725.html 源码下载地址:http://diducoder.com/sotr ...
- 一个Sqrt函数引发的血案(转)
作者: 码农1946 来源: 博客园 发布时间: 2013-10-09 11:37 阅读: 4556 次 推荐: 41 原文链接 [收藏] 好吧,我承认我标题党了,不过既然你来了, ...
- 一个字母引发的血案 java.io.File中mkdir()和mkdirs()
一个字母引发的血案 明天开始放年假了,临放假前有个爬虫的任务,其中需要把网络图片保存到本地,很简单,马上写完了代码: //省略部分代码... Long fileId= (Long) data.get( ...
- form表单提交引发的血案
最近,公司某条产品线上的一个功能出了问题:点击查询的时候,该页面在IE上直接卡死,chrome上会卡顿一段时间候提交表单进行查询.拿到这个bug单子以后,简单重现了下,基本上定位到是查询操作中的问题, ...
随机推荐
- tomcat 10无法使用jstl 如何添加依赖
以Tomcat 10.0.23 idea 2021.1版本为例需要添加依赖 <dependency> <groupId>org.glassfish.web</grou ...
- ELK技术-Logstash
1.背景 1.1 简介 Logstash 是一个功能强大的工具,可与各种部署集成. 它提供了大量插件,可帮助业务做解析,丰富,转换和缓冲来自各种来源的数据. Logstash 是一个数据流引擎 它是用 ...
- openstack中Glance组件简解
一.Glance组件介绍 1.概念 Glance是OpenStack镜像服务,用来注册.登陆和检索虚拟机镜像.Glance服务提供了一个REST API,使你能够查询虚拟机镜像元数据和检索的实际镜像. ...
- 【必知必会】手把手教你配置MySQL环境变量——图文详解
一.先决条件 假设我们已经成功安装MySQL数据库.如果还有小伙伴不知道如何安装MySQL数据库,可以在本文下留言,留言数超20,则出一期"手把手教你安装MySQL数据库--图文详解&quo ...
- KingbaseES V8R6 维护管理案例之---Kstudio在CentOS 7启动故障
案例说明: 在CentOS 7上安装KingbaseES V8R6C006数据库后,启动Kstudio图形界面启动失败,gtk动态库加载失败,安装gtk相关动态库后,问题解决. 适用版本: Kin ...
- KingbaseES V8R6C5 通过securecmdd工具手工脚本部署集群
案例说明: 对于KingbaseES V8R6C5版本在部集群时,需要建立kingbase.root用户在节点间的ssh互信,如果在生产环境禁用root用户ssh登录,则通过ssh部署会失败:V8R6 ...
- C#非托管泄漏中HEAP_ENTRY的Size对不上是怎么回事?
一:背景 1. 讲故事 前段时间有位朋友在分析他的非托管泄漏时,发现NT堆的_HEAP_ENTRY 的 Size 和 !heap 命令中的 Size 对不上,来咨询是怎么回事? 比如下面这段输出: 0 ...
- kibana启动停止命令
前提条件:kibana文件是属于kibana用户的 注意:路径根据具体实际情况修改 更改日志所属用户和用户组 chown kibana:kibana /usr/local/kibana-7.5.1-l ...
- 通过Metricbeat实现外部对Elastic Stack的监控
对于Elastic Stack监视的所有用户,建议使用外部数据收集. 概括一下: 关闭Elastic Stack自带的监控功能,然后使用metricbeat收集Elastic Stack数据传输到另外 ...
- krew插件安装
概念 Krew是kubectl插件的包管理工具.借助Krew,可以轻松地使用kubectl plugin:发现插件.安装和管理插件.使用类似apt.dnf或者brew. 对于kubectl用户:kre ...