升级SpringBoot版本,引出了一个大Bug

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

前言

最近项目组升级了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一下你们的代码,看看有没有类似的用法,不然迟早有一天也会中招。

责任编辑:姜华 来源: 苏三说技术
相关推荐

2020-06-09 08:06:31

RocketMQ消息耗时

2022-02-28 00:14:30

人工智能数据机器学习

2021-09-01 08:58:15

项目 UTFailed

2015-07-27 10:34:55

大数据大忽悠

2010-08-06 14:05:56

WPF

2010-04-15 15:23:41

2022-02-24 11:46:38

区块链技术NFT

2021-05-07 07:59:52

WebFluxSpring5系统

2011-10-18 13:43:31

福布斯信息技术企业计算

2012-05-30 09:40:55

Linux锅炉

2022-04-06 09:47:55

AI谷歌人工智能

2021-10-08 07:50:57

软件设计程序

2014-02-12 14:45:40

Linux文本文件

2018-06-20 15:50:38

JDK9JVMJDK10

2020-09-29 07:44:20

跨域前后端分离插件

2024-02-04 16:14:38

线程开发

2017-02-16 16:03:29

RSAC安全展览会

2009-09-14 17:08:02

WebFormView

2024-04-22 00:00:01

Redis集群

2017-12-27 14:51:12

Kotlin谷歌Java
点赞
收藏

51CTO技术栈公众号