前语

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

到底是怎么回事呢?

1.案发现场

有一天,项目组的搭档反应给我说,我之前有个接口在新的测验环境报错了,详细反常是:Missing argment level for method parameter of type Integer

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

他说近期另外一个搭档为了布置阿里云服务器,把新测验环境SpringBoot的版别晋级到了最新版

之后,在测验的过程中,发现我有个Get恳求接口报反常了。

该接口代码相似于这样:

一次SpringBoot版本升级,引发的血案
在getCategory接口中,有两个参数:

  1. type表明大类,是必传的。
  2. level表明要返回几级分类,比方:4级分类,就传4,对错必传的,默认便是查4级分类。

便是这样一个接口的level参数,前端没有传参,例如:

一次SpringBoot版本升级,引发的血案
成果被Spring MVC阻拦直接报错了。

2 报错的原因

从打印的反常信息看,现在level参数必须要传值了,之前是可传,可不传的。

我后来本计划自定义Spring的转换器,修正一下校验规则,跟老版别保持一致。

这样那些基本接口就不必改了。

但后来发现,被spring-web-5.3.23的源码无情的打脸了。

org.springframework.web.method.annotation包下的AbstractNamedValueMethodArgumentResolver类的resolveArgument办法中:多了这样的校验。假如该参数为空,没有设置默认值,required特点为true,而且不是Optional类型,则执行handleMissingValueAfterConversion办法。该办法会调用handleMissingValue办法,详细代码如图中所示:

一次SpringBoot版本升级,引发的血案
最后会抛出之前我看到的那个反常。

原因最新版别的Spring中不允许Get接口的恳求参数,在不使用@RequestParam注解时,值为空的状况呈现了。

3 怎么处理问题?

想要处理上面的报错问题,其实很简单,只需在level参数前加@RequestParam注解,而且设置required特点为false

例如:

一次SpringBoot版本升级,引发的血案
可是后边发现,项目中不只我这一个接口要调整,其他许多搭档的接口,也有相似的问题,需求修正的接口许多。

这个改动的工作量不小。

哭晕在测验。。。

后话

这个问题有许多人中招,所以非常有必要把这个问题共享给我们,防微杜渐。

我之前level参数不加@RequestParam注解,也没设置required特点,其时持有的心态是Spring有默认值,有些注解不加,程序也能正常运行,已然这样就可以少写点代码,而且在其时的版别测验过,没有呈现过什么问题。

这种状况其实是Spring结构的一个bug,已经在最新版别中被修复了。。。

赶紧review一下你们的代码,看看有没有相似的用法,不然迟早有一天也会中招。

最后说一句(求重视,别白嫖我)

假如这篇文章对您有所帮助,或许有所启示的话,帮忙扫描下发二维码重视一下,您的支持是我坚持写作最大的动力。

求一键三连:点赞、转发、在看。

重视大众号:【苏三说技术】,在大众号中回复:面试、代码神器、开发手册、时间管理有超赞的粉丝福利,另外回复:加群,可以跟许多BAT大厂的长辈沟通和学习。