欢迎光临
我们一直在努力

Spring Boot 删除接口参数绑定报错

问题背景

我在跟着黑马javaWeb课程后端实战本地测试删除接口时调用:

DELETE http://localhost:8080/depts?id=1

接口返回 500,控制台核心报错是:

Name for argument of type [java.lang.Integer] not specified, and parameter name information not found in class file either.

当时后端问题代码是:

@DeleteMapping("/depts")
public Result delete(Integer id) { ... }

———

排查过程

1.500表示后端有问题。
2. 问trae插件ai glm4.6发现 Controller 参数没有写 @RequestParam,但是我看的黑马视频是可以省略注解的,然后给了我方法但是我没复制对(最后搞定问题才发现,只复制了中间的)。添加的配置:

<compilerArgs>
<arg>-parameters</arg>
</compilerArgs>

  • 然后加上了@RequestParam(“id”),发现运行没问题。
  • 然后就问了gpt5.4才说明了@RequestParam可以省略,但是为什么我的不行。然后gpt告诉我省略注解要在yml添加配置项(可能是我之前看视频看完后忘记添加了)。gpt叫我关注异常关键句:parameter name information not found in class file either(意思大概是检查构建配置,确认编译时没有保留参数名信息。)
  • 结论:问题不是“前端没传 id”,而是“后端运行时拿不到参数名,无法绑定”。

    ———

    gpt给出的可选解决方案(不止一种,这里我放出来看看应该也会对大家有所帮助)

    方案 1:显式使用 @RequestParam(“id”)(最稳)

    @DeleteMapping("/depts")
    public Result delete(@RequestParam("id") Integer id) { ... }

    优点:不依赖编译参数。
    缺点:注解会多一些。

    方案 2:启用参数名保留(我要采用的)

    在 pom.xml 里开启:

    <parameters>true</parameters>

    优点:参数同名时可省略注解。
    缺点:依赖构建配置,漏配会复发。

    方案 3:改用路径参数

    接口改为:

    DELETE /depts/{id}

    @DeleteMapping("/depts/{id}")
    public Result delete(@PathVariable Integer id) { ... }

    优点:REST 语义清晰。
    缺点:前后端都要改。

    方案 4:Mapper 层加 @Param(“id”)(防止后续坑)

    void deleteById(@Param("id") Integer id);

    说明:这不是本次 Controller 报错根因,但能避免 MyBatis 参数名解析问题。

    ———

    经验总结

    “前端参数名和后端形参名一致可以省略注解”这句话成立的前提是: 编译产物里保留了参数名信息(如 Maven 开启 true)。

    以后遇到同类报错(可以先问ai,可以说明情况(像我这个小问题就算了直接抛给他),如果不知道怎么说就可以描述一些遇到问题过程吧),优先检查:

  • Controller 是否显式写了 @RequestParam / @PathVariable
  • pom.xml 是否开启了 true
  • 修改后是否重新编译并重启服务
  • 赞(0)
    未经允许不得转载:171主机测评 » Spring Boot 删除接口参数绑定报错
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址