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

相关文章
|
19天前
|
druid Java Maven
|
26天前
|
Java Maven Spring
springboot学习一:idea社区版本创建springboot项目的三种方式(第三种为主)
这篇文章介绍了在IntelliJ IDEA社区版中创建Spring Boot项目的三种方法,特别强调了第三种方法的详细步骤。
160 0
springboot学习一:idea社区版本创建springboot项目的三种方式(第三种为主)
|
24天前
|
Java Maven Spring
查看springboot版本支持最高的java版本
截至最近更新,Spring Boot 3.0及以上版本支持的最高Java版本为Java 17。鉴于技术的不断演进,建议直接参考Spring Boot的官方文档获取最准确的支持信息,因为这些版本兼容性可能会随着新版本的发布而有所变化。选择与你的Spring Boot版本相匹配的Java版本,可以确保充分利用框架特性,同时保证项目的稳定性和前瞻性。
40 0
|
2月前
|
前端开发 Java Spring
【非降版本解决】高版本Spring boot Swagger 报错解决方案
【非降版本解决】高版本Spring boot Swagger 报错解决方案
|
1月前
|
自然语言处理 搜索推荐 Java
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(一)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图
47 0
|
1月前
|
存储 自然语言处理 搜索推荐
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
SpringBoot 搜索引擎 海量数据 Elasticsearch-7 es上手指南 毫秒级查询 包括 版本选型、操作内容、结果截图(二)
32 0
|
3月前
|
JavaScript 前端开发 Java
SpringBoot + Vue 前端后分离项目精进版本
这篇文章详细介绍了一个基于SpringBoot + Vue的前后端分离项目的搭建过程,包括前端Vue项目的初始化、依赖安装、页面创建和路由配置,以及后端SpringBoot项目的依赖添加、配置文件修改、代码实现和跨域问题的解决,最后展示了项目运行效果。
SpringBoot + Vue 前端后分离项目精进版本
|
3月前
|
缓存 前端开发 JavaScript
前后端分离 SpringBoot+Vue商城买卖系统通杀版本。大家可以参考学习一下
这篇文章介绍了一个使用SpringBoot+Vue开发的前后端分离商城系统,包括技术架构、开发环境、实现的功能以及项目截图,并展示了普通用户和商家端的功能界面。
前后端分离 SpringBoot+Vue商城买卖系统通杀版本。大家可以参考学习一下
|
3月前
|
Java API 开发者
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
120 0
JDK8到JDK17版本升级的新特性问题之SpringBoot选择JDK17作为最小支持的Java lts版本意味着什么
|
3月前
|
Java
SpringBoot和SpringCloud对应版本
SpringBoot和SpringCloud对应版本
83 0