[转帖]一次SpringBoot版本升级,引发的血案

一次,springboot,版本升级,引发,血案 · 浏览次数 : 0

小编点评

## 问题分析 该问题主要围绕着Spring Boot版本升级的异常情况展开,以及如何解决该异常。 **1. 问题描述:** * 项目升级了Spring Boot版本,从 2.0.4 到 2.7.5,却引出了一个大 Bug。 * 接口在新的测试环境报错了,具体异常是:`Missing argment level for method parameter of type Integer`。 * 后来发现,在升级后的版本中,接口的 `level` 参数必须被传值,之前是可传的,可不传的。 **2. 问题分析:** * 异常信息显示 `level` 参数在 `handleMissingValueAfterConversion` 方法中被校验,当其值为空或未设置默认值时,会抛出 `Missing argment level for method parameter of type Integer` 的异常。 * 这可能因为在升级过程中,对于 `level` 参数的默认值没有设置,导致在校验时引发了异常。 **3. 解决方案:** * 解决方法是根据异常信息添加 `@RequestParam` 注解,并设置 `required` 属性为 `false`。 * 此方法会绕过 `handleMissingValueAfterConversion` 方法,避免抛出异常。 **4. 总结:** 该问题是 Spring Boot版本升级过程中 `Missing argment level for method parameter of type Integer` 的异常,可以通过添加 `@RequestParam` 注解解决该问题。

正文

https://z.itpub.net/article/detail/B6495288E725529E58105397659A08EB

 

前言

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

与[转帖]一次SpringBoot版本升级,引发的血案相似的内容:

[转帖]一次SpringBoot版本升级,引发的血案

https://z.itpub.net/article/detail/B6495288E725529E58105397659A08EB 前言 近项目组升级了SpringBoot版本,由之前的2.0.4升级到新版本2.7.5,却引出了一个大Bug。 到底是怎么回事呢? 1.案发现场 有一天,项目组的同

[转帖]记录一次spring-boot程序内存泄露排查

现象 spring boot项目jvm启动配置-Xms4g -Xmx4g,然而很不幸的是程序所占的内存越来越高,都达到了12个多G,只能临时重启服务 常用命令 jstat -class PIDjstat -compiler PIDjstat -gc PIDjstat -gccapacity PIDj

[转帖]一次艰难的内存泄露排查

https://www.jianshu.com/p/d0dff28a4cce 一次艰难的内存泄露排查 现象 2019.4.26 22:00左右,通过jstat -gcutil pid 5000 ,发现fgc次数很多而且频繁,此时老年代占比已经大约70%左右,且已经回收不了内存,我们这边设置的fgc阈

[转帖]一次春节大促性能压测不达标的瓶颈推演

https://plantegg.github.io/2020/11/23/%E4%B8%80%E6%AC%A1%E6%98%A5%E8%8A%82%E5%A4%A7%E4%BF%83%E6%80%A7%E8%83%BD%E5%8E%8B%E6%B5%8B%E4%B8%8D%E8%BE%BE%E6%

[转帖]一次 Scan 竟耗时上百秒?Redis Scan 原理解析与踩坑

来自:指月 https://www.lixueduan.com原文:https://www.lixueduan.com/post/redis/redis-scan/主要分析了 Redis Scan 命令基本使用和具体实现,包括Count 参数与 Scan 总耗时的关系,以及核心的逆二进制迭代算法分析

[转帖]一次海光物理机资源竞争压测的记录

一次海光物理机资源竞争压测的记录 https://plantegg.github.io/2021/03/07/%E4%B8%80%E6%AC%A1%E6%B5%B7%E5%85%89%E7%89%A9%E7%90%86%E6%9C%BA%E8%B5%84%E6%BA%90%E7%AB%9E%E4%B

[转帖]一次海光物理机资源竞争压测的记录

一次海光物理机资源竞争压测的记录 https://plantegg.github.io/2021/03/07/%E4%B8%80%E6%AC%A1%E6%B5%B7%E5%85%89%E7%89%A9%E7%90%86%E6%9C%BA%E8%B5%84%E6%BA%90%E7%AB%9E%E4%B

[转帖] 一次SSL握手异常,我发现JDK还有发行版区别

https://www.cnblogs.com/codelogs/p/16633704.html 简介# 最近,我们一个多机房部署的服务,调用方反馈有问题,在调用新加坡机房时正常,而调用印度机房则报SSL握手异常。 排查花了一些时间,同时也积累了一些经验,故记录一下,读完本文,你将了解到如下内容:

[转帖]一次fork引发的惨案!

https://www.cnblogs.com/xuanyuan/p/15502289.html “你还有什么要说的吗?没有的话我就要动手了”,kill程序最后问道。 这一次,我没有再回答。 只见kill老哥手起刀落,我短暂的一生就这样结束了··· 我是一个网络程序,一直以来都运行在Windows系

[转帖]一次操作系统报错OutOfMemory Error的处理记录

在启动公司内嵌的tomcat容器时出现报错, 如下: # There is insufficient memory for the Java Runtime Environment to continue.# Native memory allocation (malloc) failed to a