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

2023-10-27

前言

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一次SpringBoot版本升级,引发的血案 的相关文章

  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • Hibernate 挂起或引发延迟初始化,没有会话或会话已关闭

    我正在增强旧的 Spring Hibernate 应用程序 但我陷入困境 我有一种方法可以读取 3000 多行长的文件 每行都有一条记录 必须与数据库中的某些内容进行比较 然后必须将寄存器添加到数据库 多对多表 表和关系是 Branch h
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • org.apache.hadoop.security.AccessControlException:客户端无法通过以下方式进行身份验证:[TOKEN,KERBEROS] 问题

    我正在使用 java 客户端通过 Kerberos 身份验证安全访问 HDFS 我尝试打字klist在服务器上 它显示已经存在的有效票证 我收到的异常是客户端无法通过以下方式进行身份验证 TOKEN KERBEROS 帮助将不胜感激 这是一
  • 如何在java中将一个数组列表替换为另一个不同大小的数组列表

    我有两个大小不同的数组列表 如何从此替换 ArrayList
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • 如何获取之前的URL?

    我需要调用我的网络应用程序的 URL 例如 如果有一个从 stackoverflow com 到我的网站 foo com 的链接 我需要 Web 应用程序 托管 bean 中的 stackoverflow 链接 感谢所有帮助 谢谢 并不总是
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 在接口中使用默认方法是否违反接口隔离原则?

    我正在学习 SOLID 原则 ISP 指出 客户端不应被迫依赖于他们所使用的接口 不使用 在接口中使用默认方法是否违反了这个原则 我见过类似的问题 但我在这里发布了一个示例 以便更清楚地了解我的示例是否违反了 ISP 假设我有这个例子 pu
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • 创建一个 JSON 对象以在 Spring Boot 测试中发布

    我想编写基本测试来使用 JSON 负载在 users URL 上执行 POST 请求来创建用户 我找不到如何将新对象转换为 JSON 到目前为止有这么多 这显然是错误的 但解释了目的 Test public void createUser

随机推荐

  • uni-app 高度自适应

    方法一已知固定高度 注意 scrollH 初始值不等大于最终显示的高度 如果封装组件 onReady onLoad 获取可视区域高度 减去固定高度 uni getSystemInfo success res gt this scrollH
  • nacos--基础--1.2--理论--概念

    nacos 基础 1 2 理论 概念 1 地域 物理的数据中心 资源创建成功后不能更换 2 可用区 同一地域内 电力和网络互相独立的物理区域 同一可用区内 实例的网络延迟较低 3 接入点 地域的某个服务的入口域名 4 命名空间 用于进行租户
  • 国外程序员的BASIC情结——我的编程生涯始于BASIC

    关于BASIC Edsger Dijkstra曾经说过这么一段话 那些已经学过BASIC的学生是不可教化的 再去教他们优秀的编程风格注定徒劳无功 他们已经脑残 再生无望 成不了优秀的程序员 BASIC是Beginner sAll purpo
  • 如何正确使用QTcpSocket的readyRead信号?

    一 问题描述 你之所以会来看我这篇文章 大概是遇到了一下几个问题 1 使用QTcpSocket时 readyread函数没有触发 或者触发了 但是触发次数不是自己想象的那样 2 readyread槽函数中 接收到的数据不对 我们先看一下Qt
  • hashmap为什么用红黑树_关于HashMap的实现,一篇文章带你彻底搞懂,再也不用担心被欺负

    推荐学习 刷透近200道数据结构与算法 成功加冕 题王 挤进梦中的字节 面试官杠上Spring是种什么体验 莫慌 送你一套面试 大纲 源码 前言 在介绍HashMap之前先了解一个别的东西 红黑树 这边提前声明下 发布文章的时候没太注意 有
  • vue当前(路由)页面跳转当前(路由)页面,刷新数据

    最近呢 总是踩坑 就是那种今天我写了代码 但是吧一直报错 然后明天再写就对了 咱也不知道是为啥 咱也不知道是咋回事 只能说萌新小白在线吃菜 言归正传 最近写了一个商品详情页 在当前商品详情页 还可以跳到另一个商品的详情页 也就是改变参数 当
  • kudu : 扩容报错 Bad status: Not found: Unable to initialize catalog manager

    文章目录 1 美图 2 背景 1 美图 2 背景 kudu 原本只有一个master 和一个 tableServer 现在我想扩容成3个master 3个tableServer 然后报错了 错误信息如下
  • C++递推经典案例No.1——青蛙跳台问题

    一只青蛙一次可以跳上1级台阶 也可以跳上2级台阶 求该青蛙跳上一个 n 级的台阶总共有多少种跳法 这是一个经典的递归 动态规划的例题 代码部分并不难 关键是要理清思路 由于每次可以跳1个或者两个 所以跳到当前台阶的来源只有两种 下一个和下两
  • Android Studio 修改AVD模拟器文件默认存储路径

    AndroidStudio默认的模拟器文件路径为 C Users 用户名 android avd路径 通常windows系统上 C盘不是太大 而avd文件却不小 通常几个GB 所以有必要将avd路径换到一个非系统盘 更换方法如下 Help
  • sql 列名无效

    在SQLServer2008中 当设计 修改 表结构之后 再用SQL语句时 列名会显示无效 但执行可以通过 如下图 原因是SQL Server的intellisense 智能感知功能 需要重新整理一下 用快捷键Ctrl Shift R即可
  • YOLO:使用cv旋转图片,绘制最小矩形框,生成txt数据集,可用于yolo训练模型

    目录 一 前期的目录准备 二 代码部分需要用到的cv函数 三 cv部分函数参数详情 四 旋转方式 五 代码部分 六 代码完整版 一 前期的目录准备 创建一个名为rice的目录 在此下创建arborio basmati等五类米的子目录 并且分
  • (Android版)AR 现实增强 高通 Vuforia QCAR SDK环境搭建

    1 下载高通SDK 高通刚刚才更新开发中心地址 版本更新为V2 0 https developer vuforia com resources sdk android 下载对应系统的安装程序 下载完成后 你就下一步下一步安装吧 2 编译QC
  • Zotero使用

    zotero使用 实验平台 Zotero安装 导入文献到Zotero 设置PDF文件保存位置 Zotfile插件安装 Zotero文献同步 在Zotero中导入PDF翻译插件 参考文献 实验平台 Windows10 Mac平台有些设置的名字
  • Azkaban的囚徒——Azkaban运行模式和流

    文章目录 Azkaban运行模式 Azkaban运行 Azkaban 流 Job Dependency Azkaban运行模式 在3 x版本里 提供了3种运行模式 the stand alone solo server mode stand
  • 服务器安装系统要如何载入驱动程序,Dell 服务器安装Windows 2008 R2时手动加载阵列卡驱动...

    使用操作系统光盘或U盘安装操作系统 需要事先准备好对应的阵列卡驱动 安全完成后需要自行手动加载主板 显卡 网卡驱动 1 开机之后通过界面提示通过键盘按下 F11 进入 Boot Manager 选择启动选项 2 在 Boot Manager
  • Oracle 数据库索引扫描方式

    1 索引范围扫描 Index Range Scan 当我们在查询操作中使用了 WHERE 子句进行范围查询时 Oracle 数据库会使用索引范围扫描方式 这种扫描方式通过索引键值的范围来定位需要的数据 例如 我们有一个名为 orders 的
  • 2012.11.20

    昨晚到23 50 实在是困了 于是睡了 发现 杆9其实是个虚拟杆 也就是说 相当于一个辅助线 不INITGEOMETRY 不绘制 只计算 现在设定P1的点 根据余弦定理求出 三角形P1P2P3中 P2对应的角度 a 2 b 2 c 2 2b
  • 为学生夫妻安排一间宿舍两张床,武大的回应亮了

    来源 中国青年报综合自武汉大学官微 身高太高 睡不下宿舍的床咋办 行动有障碍 不方便睡上下铺咋办 第一次来到南方 湿度太大怎么晾衣服 学生夫妻可以申请合宿吗 这两天 武大 宿舍定制服务 在网上刷屏 引发关注 1 学校为 持证上岗 的夫妻档准
  • python3+robotframework+selenium3 浏览器兼容性测试

    robot framework 测试浏览器兼容性 目前ride已支持一下浏览器 firefox ie chrome safari 本次我们已win 10中的ie为例 来看看如何使用python3 robotframework seleniu
  • 一次SpringBoot版本升级,引发的血案

    前言 最近项目组升级了SpringBoot版本 由之前的2 0 4升级到最新版本2 7 5 却引出了一个大Bug 到底是怎么回事呢 1 案发现场 有一天 项目组的同事反馈给我说 我之前有个接口在新的测试环境报错了 具体异常是 Missing