一次SpringBoot版本升级,引发的血案

简介: 最近项目组升级了SpringBoot版本,由之前的2.0.4升级到最新版本2.7.5,却引出了一个大Bug。到底是怎么回事呢?

前言
最近项目组升级了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一下你们的代码,看看有没有类似的用法,不然迟早有一天也会中招。
最后说一句(求关注,别白嫖我)
如果这篇文章对您有所帮助,或者有所启发的话,帮忙扫描下发二维码关注一下,您的支持是我坚持写作最大的动力。

相关文章
|
29天前
|
JavaScript 前端开发 Java
SpringBoot + Vue 前端后分离项目精进版本
这篇文章详细介绍了一个基于SpringBoot + Vue的前后端分离项目的搭建过程,包括前端Vue项目的初始化、依赖安装、页面创建和路由配置,以及后端SpringBoot项目的依赖添加、配置文件修改、代码实现和跨域问题的解决,最后展示了项目运行效果。
SpringBoot + Vue 前端后分离项目精进版本
|
29天前
|
缓存 前端开发 JavaScript
前后端分离 SpringBoot+Vue商城买卖系统通杀版本。大家可以参考学习一下
这篇文章介绍了一个使用SpringBoot+Vue开发的前后端分离商城系统,包括技术架构、开发环境、实现的功能以及项目截图,并展示了普通用户和商家端的功能界面。
前后端分离 SpringBoot+Vue商城买卖系统通杀版本。大家可以参考学习一下
|
1月前
|
Java API 开发者
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
|
1月前
|
Java
SpringBoot和SpringCloud对应版本
SpringBoot和SpringCloud对应版本
65 0
|
2月前
|
Java Maven
SpringBoot第一次导入项目,Maven依赖全爆红,该怎样解决,idea2019.3版本,必须用application2.7.6或者以下
SpringBoot第一次导入项目,Maven依赖全爆红,该怎样解决,idea2019.3版本,必须用application2.7.6或者以下
|
3月前
|
SpringCloudAlibaba Cloud Native Dubbo
SpringBoot和SpringCloud,SpringCloudAlibaba版本依赖关系
由于 Spring Boot 3.0,Spring Boot 2.7~2.4 和 2.4 以下版本之间变化较大,目前企业级客户老项目相关 Spring Boot 版本仍停留在 Spring Boot 2.4 以下,为了同时满足存量用户和新用户不同需求,社区以 Spring Boot 3.0 和 2.4 分别为分界线,同时维护 2022.x、2021.x、2.2.x 三个分支迭代。如果不想跨分支升级,如需使用新特性,请升级为对应分支的新版本。 为了规避相关构建过程中的依赖冲突问题,我们建议可以通过 云原生应用脚手架 进行项目创建。
182 0
SpringBoot和SpringCloud,SpringCloudAlibaba版本依赖关系
|
2月前
|
SQL NoSQL 关系型数据库
若依修改02,若以提供了多种版本,RuoYi-Cloud和SpringBoot+Vue都是PC端的,如果想要适配手机端,用Uniapp+vue,导入Mysql和启动Redis
若依修改02,若以提供了多种版本,RuoYi-Cloud和SpringBoot+Vue都是PC端的,如果想要适配手机端,用Uniapp+vue,导入Mysql和启动Redis
|
2月前
|
SpringCloudAlibaba Java 微服务
微服务02,微服务技术对比,SpringBoot和SpringClound版本兼容
微服务02,微服务技术对比,SpringBoot和SpringClound版本兼容
|
3月前
|
Java
springboot和elasticsearch以及springboot data elasticsearch对应的版本
springboot和elasticsearch以及springboot data elasticsearch对应的版本
165 1
|
2月前
|
JavaScript 安全 Java
Spring Boot中的版本兼容性处理
Spring Boot中的版本兼容性处理