问题背景
我在跟着黑马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>
结论:问题不是“前端没传 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,可以说明情况(像我这个小问题就算了直接抛给他),如果不知道怎么说就可以描述一些遇到问题过程吧),优先检查:





