首页 > 其他分享 >一次SpringBoot版本升级,引发的血案

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

时间:2022-11-13 15:23:42浏览次数:46  
标签:SpringBoot level Spring 血案 接口 版本升级 报错 参数

前言

最近项目组升级了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,level,Spring,血案,接口,版本升级,报错,参数
From: https://www.cnblogs.com/12lisu/p/16886010.html

相关文章

  • Springboot中-全局异常处理类用法示例
    使用springboot搭建web项目的时候,一般都会添加一个全局异常类,用来统一处理各种自定义异常信息,和其他非自定义的异常信息,以便于统一返回错误信息。下面就是简单的示例......
  • SpringBoot实现mysql主从复制
    导入依赖<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1</v......
  • SpringBoot注入
    SpringBoot属性注入涉及注解:@Configuration:声明一个类作为配置类@Bean:声明在方法上,将方法的返回值加入Bean容器@Value:属性注入@ConfigurationProperties(prefix=“j......
  • 一台路由器引发的血案
    短短24小时内,一个路由器经历了刷机到变砖再到成功救砖……一切都发生在这台小米路由器PRO型号R3P的路由器身上。一刷机需求U盘一个可以正常链接的网线一根起因......
  • 【SpringBoot】分布式RPC+Zokeeper+SpringBoot练手
    RPCRPC两个核心模块:通讯,序列化序列化:数据传输需要转换DubboApacheDubbo|ˈdʌbəʊ|是一款高性能、轻量级的开源JavaRPC框架,它提供了三大核心能力:面向接口的远程......
  • # SpringBoot 整合 Swagger
    SpringBoot整合Swagger是什么不介绍,这个东西很简单,主要看点底层源码即可,注意:这个东西很容易造成版本错乱的部分引入狂神说的代码段,因为我有些东西懒得写引入<sp......
  • 【SpringBoot】必须掌握的45个注解
    1、SpringBoot/spring@SpringBootApplication:包含@Configuration、@EnableAutoConfiguration、@ComponentScan通常用在主类上;@Repository:用于标注数据访问组件,即DAO组件......
  • 11-SpringBoot2整合Vue最简入门
    vuejs入门环境搭建》1:导入文件<scripttype="text/javascript"src="js/vue.js"></script><scripttype="text/javascript"src="js/axios.js"></script>》2:准备app视......
  • 08-SpringBoot2.0 集成 mybatis注解开发***
    1,依赖pom.xml<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><versi......
  • SpringBoot(二):创建SpringBoot项目的方式
    一、通过官网进行创建官网创建链接:https://start.spring.io/1.官网页面配置: Project:我们需要选择项目类型,我使用的是Maven项目;Language:使用的是Java语言,选择Java;Sp......