前言

最近项目组升级了SpringBoot版本,由之前的2.0.4升级到最新版本2.7.5,却引出了一个大Bug。

到底是怎么回事呢?

1.案发现场

有一天,项目组的同事反馈给我说,我之前有个接口在新的测试环境报错了,具体异常是:Missing argment level for method parameter of type Integer

我当时的第一反应有点懵,心想这个接口是一个老接口,有一年多的时间都没改过了,怎么会出问题呢?

他说近期另外一个同事为了部署阿里云服务器,把新测试环境SpringBoot的版本升级到了最新版

之后,在测试的过程中,发现我有个Get请求接口报异常了。

该接口代码类似于这样:



在getCategory接口中,有两个参数:

  1. type表示大类,是必传的。
  2. 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版本升级,引发的血案的更多相关文章

  1. 一个无锁消息队列引发的血案(三)——地:q3.h 与 RingBuffer

    目录 (一)起因 (二)混合自旋锁 (三)q3.h 与 RingBuffer (四)RingQueue(上) 自旋锁 (五)RingQueue(中) 休眠的艺术 (六)RingQueue(中) 休眠的 ...

  2. [WCF]缺少一行代码引发的血案

    这是今天作项目支持的发现的一个关于WCF的问题,虽然最终我只是添加了一行代码就解决了这个问题,但是整个纠错过程是痛苦的,甚至最终发现这个问题都具有偶然性.具体来说,这是一个关于如何自动为服务接口(契约 ...

  3. dubbox微服务实例及引发的“血案”

    Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成. 主要核心部件: Remoting: 网络通信框架 ...

  4. Integer.parseInt 引发的血案

    Integer.parseInt 处理一个空字符串, 结果出错了, 程序没有注意到,搞了很久, 引发了血案啊!! 最后,终于 观察到了, 最后的部分: Caused by: java.lang.NoC ...

  5. Replication的犄角旮旯(六)-- 一个DDL引发的血案(上)(如何近似估算DDL操作进度)

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

  6. Replication的犄角旮旯(七)-- 一个DDL引发的血案(下)(聊聊logreader的延迟)

    <Replication的犄角旮旯>系列导读 Replication的犄角旮旯(一)--变更订阅端表名的应用场景 Replication的犄角旮旯(二)--寻找订阅端丢失的记录 Repli ...

  7. 转:一个Sqrt函数引发的血案

    转自:http://www.cnblogs.com/pkuoliver/archive/2010/10/06/1844725.html 源码下载地址:http://diducoder.com/sotr ...

  8. 一个Sqrt函数引发的血案(转)

    作者: 码农1946  来源: 博客园  发布时间: 2013-10-09 11:37  阅读: 4556 次  推荐: 41   原文链接   [收藏]   好吧,我承认我标题党了,不过既然你来了, ...

  9. 一个字母引发的血案 java.io.File中mkdir()和mkdirs()

    一个字母引发的血案 明天开始放年假了,临放假前有个爬虫的任务,其中需要把网络图片保存到本地,很简单,马上写完了代码: //省略部分代码... Long fileId= (Long) data.get( ...

  10. form表单提交引发的血案

    最近,公司某条产品线上的一个功能出了问题:点击查询的时候,该页面在IE上直接卡死,chrome上会卡顿一段时间候提交表单进行查询.拿到这个bug单子以后,简单重现了下,基本上定位到是查询操作中的问题, ...

随机推荐

  1. 【JAVA】学习路径36-写到硬盘FileOutputStream Write的三种方法

    import java.io.FileOutputStream;import java.io.FileReader;import java.io.IOException;import java.nio ...

  2. C# for循环创建多线程

    这里仅讨论Task多线程编程,不讨论其他可以使用多线程的情况,比如Beginxxx,Thread等 一般情况下,如果有多个线程需要同是启动,且每个线程中使用了集合collection中的序号. 比如参 ...

  3. js函数( 普通函数、箭头函数 ) 内部this的指向

    - 普通函数   | 具名普通函数.匿名普通函数,在不作为对象的属性值的情况下,其内部的 this 总是指向代码运行环境下的全局对象 ( 例如,浏览器中的 window ). 示例: (functio ...

  4. JDK 自带的服务发现框架 ServiceLoader 好用吗?

    请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 Github · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...

  5. win10算hash值,md5,sha256等,无需额外下载工具

    # windows_cmd certutil -hashfile .\文件名 SHA256 可选哈希算法:md2/md4/md5/sha1/sha256/sha384/sha512

  6. 让Python更优雅更易读(第二集)

    友情链接 让Python更优雅更易读(第一集) 1.装饰器 1.1装饰器特别适合用来实现以下功能 运行时校验:在执行阶段进行特定校验,当校验通不过时终止执行. 适合原因:装饰器可以方便地在函数执行前介 ...

  7. 企业运维实践-丢弃手中的 docker build , 使用Kaniko直接在Kubernetes集群或Containerd环境中快速进行构建推送容器镜像

    关注「WeiyiGeek」公众号 设为「特别关注」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 首发地址: h ...

  8. SQL CASE语句的使用

    SQL CASE语句的使用 CASE是一个控制流语句,其作用与IF-THEN-ELSE语句非常相似,可根据数据选择值. CASE语句遍历条件并在满足第一个条件时返回值. 因此,一旦条件成立,它将短路, ...

  9. 如何干涉MySQL优化器使用hash join

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. GreatSQL是MySQL的国产分支版本,使用上与MySQL一致. 前言 实验 总结 前言 数据库的优化器相当于人类的大 ...

  10. 华南理工大学 Python第5章课后小测-1

    1.(单选)以下哪个函数的定义是错误的?(本题分数:2)A) def vfunc(a,b=2):B) def vfunc(a,b):C) def vfunc(a,*b):D) def vfunc(*a ...