前言近期项目组将SpringBoot版本从之前的2.0.4升级到最新的2.7.5版本,却导致了大bug。究竟发生了什么?1、某天在案发现场,项目组的同事告诉我,我在新的测试环境下有一个界面报错。具体异常是:缺少整数类型方法参数的参数级别。我当时的第一反应是有点懵。还以为这个界面是老界面了,一年多没换过。怎么会有问题?他说,最近另一位同事为了部署阿里云服务器,将新测试环境SpringBoot的版本升级到了最新版本。后来在测试的时候,发现自己有一个Get请求接口报异常。接口代码类似这样:在getCategory接口中,有两个参数:type表示类别,必须传入。level表示返回多少级分类,例如:4级分类,传4即可,如果可选,默认勾选4级分类。就是这样一个接口的级别参数,前端不传参数,比如:结果被SpringMVC拦截,直接报错。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,在最新版本中已经修复了。..赶快检查一下你的代码,看看有没有类似的用法,不然迟早有一天你会上当受骗的。
