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

news2025/7/23 15:26:12

前言

最近项目组升级了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方法,具体代码如图中所示:[图片上传失败…(image-6d82b8-1668475453497)]

最后会抛出之前我看到的那个异常。

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

3 如何解决问题?

想要解决上面的报错问题,其实很简单,只需在level参数前加@RequestParam注解,并且设置required属性为false

例如:

但是后面发现,项目中不只我这一个接口要调整,其他好多同事的接口,也有类似的问题,需要修改的接口很多。

这个改动的工作量不小。

哭晕在测试。。。

后话

这个问题有很多人中招,所以非常有必要把这个问题分享给大家,防微杜渐。

我之前level参数不加@RequestParam注解,也没设置required属性,当时持有的心态是Spring有默认值,有些注解不加,程序也能正常运行,既然这样就可以少写点代码,并且在当时的版本测试过,没有出现过什么问题。

这种情况其实是Spring框架的一个bug,已经在最新版本中被修复了。。。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/7610.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从应用层深入Framework层,Android Framework 该如何学习?

对于咱们Android开发来说,一般来说都是干上个几年之后,都得要考虑进阶或者是转行的问题。但老话说转行穷三年,不到万不得已我想大多数人都 不会去放弃现在的岗位与薪资。 如果你还在干Android并且想要进阶,那么对Framework的了解…

ava面试八股文-基础概念二

Java面试八股文-基础概念二1.重载与重写的区别2.接口与抽象类区别3.Java集合类-Collection6.lambda表达式与匿名内部类的区别1.重载与重写的区别 重载是编译时多态,重写是运⾏时多态。 方法重写: (1)参数列表与被重写方法的参数列…

低代码维格云明细视图入门教程

功能简介 低代码维格云可以将基础的数据通过设置操作权限、查询条件、限制数据范围、设置字段显示来创建数据表的明细视图。 设置步骤 功能入口 具体见报表简介 操作权限 数据表是拥有操作权限类别最多的自定义图表,操作权限包括: 可导出可见流程日志可留言可打印可添加数…

C. Balanced Bitstring(思维+子字符串规律)

Problem - 1405C - Codeforces 一个比特串是一个只由0和1字符组成的字符串,如果这个比特串的每个大小为k的子串都有相同数量的0和1字符(各为k2),那么这个比特串就被称为k平衡的。 给你一个整数k和一个只由0,1&#xf…

来自BAT的一份Java高级开发岗面试指南:金三银四必定面试无忧

作为一名即将求职的程序员,你的就业机会和风口会出现在哪里?在这种新环境下,工作应该选择大厂还是小公司?已有几年工作经验的老兵,又应该如何保持和提升自身竞争力,转被动为主动? 就目前大环境…

VMware16虚拟机添加硬盘(磁盘)和挂载硬盘(磁盘)

记录:317 场景:在VMware16虚拟机,安装了CentOS 7.9操作系统场景下,添加硬盘(磁盘)和挂载硬盘(磁盘)。 版本: 操作系统:CentOS 7.9 1.机器配置 机器名称:B200;主机名称&#xff…

企业级数据中台应用架构和技术架构

一、什么是数据中台 数据中台是一种将企业沉睡的数据变成数据资产,持续使用数据、产生智能、为业务服务,从而实现数据价值变现的系统和机制。通过数据中台提供的方法和运行机制,形成汇聚整合、提纯加工、建模处理、算法学习,并以…

【路径规划-VRP问题】基于遗传算法求解出租车网约车接送客车辆路径规划问题附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

好未来(TAL)喜忧参半的前景

来源:猛兽财经 作者:猛兽财经 猛兽财经认为好未来(TAL)的前景喜忧参半。一方面,好未来已成功转向了新业务领域,如内容解决方案和学习技术解决方案,其新的直播电商业务也有巨大的增长潜力。另一…

npm nvm cnpm常见指令

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、nvm开头操作1.安装nodejs2.查看当前正在使用的版本3.切换使用的nodejs版本二、npm开头的操作1.全局安装cnpm2.查看npm的版本4.运行项目5.安装路由5.1 vue3 的…

FRNet:Feature Reconstruction Network for RGB-D Indoor Scene Parsing

1:铺垫 多数场景解析方法使用weak distinction和大的跨度,效果不是最好的。为了解决这个问题,作者使用了内在的多层跨模态数据和反向传播去构建一个新的特征重建网络FRNet,具体来说,encoder为了获得自上而下的逐层特征…

居民消费价格指数变化新鲜出炉,这类商品同比涨幅最大

对比分析2022年10月份全国居民消费价格数据发现,今年10 月份CPI 同比增2.5%,维持近8个月新高; PPI 同比增3.3%,同比涨幅较上个月回落 2.2 个百分点。 ​ | CPI同比增2.5%,维持近8个月新高 全国居民消费价格涨跌幅情…

C++之函数模板、类模板、模板的特化

1.什么是模板? 模板是c的一种特性,允许函数或者类(对象)通过泛型(generic types)的形式表现或者运行模板可以使得函数或类在对应不同的类型(types)的时候正常工作,而无需…

数组的substring方法和substr方法

数组的substring()方法、substr()方法都可以用于字符串截取 substr(start,length) 从指定下标开始截取指定长度的字符串,不改变字符串 start 必要,开始下标,若是负数,则从字符串尾部开始截取length 可选,若省略&…

2022年下半年系统架构师考试题

很多题目想不起来了,欢迎大佬们补充 综合知识 SASS、PASS 、IASS分别代表什么(区别是什么) A.软件即服务,平台即服务,基础设施即服务 目前Gpu的最高峰值是多少 A.100TFlops B.50TFlops C.10TFlops D.1TFlops Ai芯片…

antd常用组件 select,form等

参考代码为typescriptreact 树选择 TreeSelect 下拉选项的父子节点选中不相关 import { TreeSelect } from antd;<TreeSelectshowSearchstyle{{ width: 100% }}treeData{yyIndustryOptions} // treeNodes 数据dropdownStyle{{ maxHeight: 400, overflow: auto }} //下拉…

基于Python仓库管理系统的设计与实现django框架

摘 要 随着信息化时代的到来&#xff0c;系统管理都趋向于智能化、系统化&#xff0c;仓库管理系统也不例外&#xff0c;但目前国内的有些公司仍然都使用人工管理&#xff0c;公司规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;人工管理显然已无法应对时代的变化…

Django 中间件

文章目录Django中间件默认中间件源码分析自定义中间件process_request&#xff08;掌握&#xff09;process_response&#xff08;掌握&#xff09;process_view(了解)process_template_response(了解)process_execption(了解)Django中间件 只要是涉及到全局相关的功能都可以使…

python基于PHP+MySQL的在线汽车租赁管理系统

随着时代的发展,汽车已经成为当代人们代步的主要工具。但是很多时候人们并没有购车的念头,这个时候就出现了一种新的行业,就是汽车租赁行业,这样不仅可以解决用车的需求,而且可以节省大量的购车成本,为了能够方便用户进行汽车租赁我们开发了PHP在线汽车租赁管理系统,本系统分为…

软件版本号详解

我们现在的生活离不开软件&#xff0c;版本号一般不会引起大家的关注&#xff0c;但是一旦软件出现了Bug或者其他问题&#xff0c;这个时候&#xff0c;软件的提供方都会让用户提供其软件的版本号。软件版本号长什么样呢&#xff1f;上面这张截图是我们常用的手机APP&#xff0…