当前位置: 首页 > news >正文

springboot3.X 无法解析parameter参数问题

本文参考转载:https://oldmoon.top/post/191

简介

使用最新版的Springboot 3.2.1(我使用3.2.0)搭建开发环境进行开发,调用接口时出现奇怪的错。报错主要信息如下:

Name for argument of type [java.lang.String] not specified, and parameter name information not available via reflection. Ensure that the compiler uses the ‘-parameters’ flag.

原因分析

首先,这是Spring新版本导致的。为什么会出现这个问题呢?原来是Spring 6.1之后,官方加强了很多错误校验和报错提示,本文这个错也是其中之一。

Spring表示:URL中的传参,必须使用@PathVariable声明用于接收的变量,如:

@DeleteMapping("/employees/{employeeId}") public String deleteEmployee(@PathVariable int employeeId) { ... } @PatchMapping("/employees/{id}/{firstName}") public String patchEmployee(@PathVariable Integer id, @PathVariable String firstName) { ... }

官方说明中一直强调@PathVariable的使用,并没有提及@RequestParam,参考官方文档@RequestParam会发现最后有一句话:

Note that use of@RequestParamis optional (for example, to set its attributes). By default, any argument that is a simple value type (as determined by BeanUtils#isSimpleProperty) and is not resolved by any other argument resolver, is treated as if it were annotated with@RequestParam.

翻译一下大概是:

注意@RequestParam的使用是可选的(例如,设置其属性)。 默认情况下,任何简单值类型(由 BeanUtils#isSimpleProperty 确定)且未由任何其他参数解析器解析的参数都将被视为使用@RequestParam注解。

根据原文及翻译,这自然让我认为,@RequestParam依然是可以省略的。

然而奇怪的是,当Springboot 3.2.1使用Maven管理项目时,如果不使用spring-boot-starter-parent作为父工程,那么接口中必须显式声明@RequestParam("name"),缺了其中的name也会报错。我清晰地记得我在旧版本的 Springboot 中经常省略 @RequestParam(“name”) 这种写法。

但如果不使用spring-boot-starter-parent作为父工程,好像@RequestParam变成了不可省略注解。大家搭建微服务和多模块时候,通常不会使用spring-boot-starter-parent作为父工程吧?还是只有我不用?。。。 还是尽量不要尝试新版本,会少踩很多坑

当请求URL中有正常参数时,如:http://localhost:8080/user/hello?name=zhangsan,其中name为一个参数,你的Controller代码大概如下所示:

java

@GetMapping("/hello") public RespPack<?> hello(String name) { return null; }

解决

这种现象不知道是不是官方的BUG,但目前我发现几种解决方案:

  1. 在参数上使用@RequestParam("name")

  2. 使用spring-boot-starter-parent

    <!-- 将spring-boot-starter-parent作为父工程在pom.xml中引入 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.1</version> <relativePath/> </parent>
  3. maven-compiler-plugin

    网友提除解决方案:父pom或本身pom中添加maven-compiler-plugin的配置:

    <build> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.12.0</version> <configuration> <parameters>true</parameters> </configuration> </plugin> </build>

这可确保使用-parameters标志编译代码,从而使参数名称在运行时可用。

http://www.jsqmd.com/news/227775/

相关文章:

  • LeaguePrank:5个简单步骤让你的LOL界面焕然一新 [特殊字符]
  • Agent Skills(五)高级进化:强化学习与代理数据协议(ADP)——智能体技能的自我进化之路
  • TranslucentTB终极指南:轻松实现Windows任务栏透明美化
  • PDF-Extract-Kit部署教程:基于GPU加速的PDF处理方案
  • 网盘直链解析工具:三分钟实现全速下载的完整指南
  • Deepseek(八)创意灵感生成器:跨界风格融合与海报设计文案策略
  • UART发送与接收中断协同工作的项目应用解析
  • SpringBoot3.3.0集成Knife4j4.5.0实战
  • DLSS Swapper终极优化指南:三步实现游戏性能革命性提升
  • 工业控制中JLink烧录器使用教程:快速理解通信配置要点
  • AI智能体进化:学习与MCP协议实战
  • 基于Java+SpringBoot+SSM社区便民服务平台(源码+LW+调试文档+讲解等)/社区服务平台/便民服务网站/社区服务应用/便民生活平台/社区便民系统/便民服务平台/社区服务平台系统
  • 工业网关中USB Serial Controller驱动移植从零实现
  • springboot3整合SpringSecurity实现登录校验与权限认证(万字超详细讲解)
  • 10分钟搞定B站缓存视频永久保存:m4s转MP4完整指南
  • SpringBoot3 集成 Shiro
  • PDF-Extract-Kit保姆级教程:布局检测与公式识别完整步骤
  • PDF-Extract-Kit应用指南:图书馆文献数字化处理方案
  • PDF-Extract-Kit教程:如何构建自定义PDF解析流程
  • Springboot-配置文件中敏感信息的加密:三种加密保护方法比较
  • DLSS版本切换实战:3步解决游戏画质卡顿问题
  • L298N电机驱动模块STM32硬件接口深度剖析
  • PDF-Extract-Kit实战:图书数字化处理全流程详解
  • PDF-Extract-Kit保姆级教程:多语言OCR识别配置
  • PDF-Extract-Kit主题建模:自动分类文档内容
  • 5分钟快速上手:B站缓存视频m4s转MP4终极指南
  • STM32+Keil5 MDK安装教程:解决兼容性问题的核心要点
  • 解决STM32驱动ST7735花屏问题的系统学习
  • Keil5安装失败应对策略:实战案例分析
  • 基于SpringBoot的校园资源共享系统【个性化推荐算法+数据可视化统计】