java.lang.IllegalArgumentException: Name for argument of type [java.lang.Integer] not specified报错解决

开头先说解决方案有俩个。

第一:

加一个这个插件,如果你有这个插件启用 -parameters 编译器标志

这里的版本自己去按照自己想要的配置。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>${maven-compiler-plugin.version}</version>
    <configuration>
        <source>${java.version}</source>
        <target>${java.version}</target>
        <encoding>${project.build.sourceEncoding}</encoding>
        <!-- 启用 -parameters 编译器标志 -->
        <compilerArgument>-parameters</compilerArgument>
    </configuration>
</plugin>

第二:

注:这个方法不一定好用。但是可以不用添加额外的插件

假设你是直接加的PathVariable例如

// 删除歌手
@DeleteMapping("/singer/delete/{id}")
public R deleteSinger(@PathVariable Integer id) {
    return singerService.deleteSinger(id);
}

这样的,那就给PathVariable直接指定一个值

// 删除歌手
@DeleteMapping("/singer/delete/{id}")
public R deleteSinger(@PathVariable("id") Integer id) {
    return singerService.deleteSinger(id);
}

之后我们来说原理

原理

在 Spring Boot 项目中,我们常常需要通过 @PathVariable@RequestParam 注解从 URL 或请求中获取参数。当我们在控制器方法中使用这些注解时,Spring 通过反射机制来匹配参数。但是,有时候我们会遇到一个问题——Spring 无法正确地绑定方法参数,导致绑定失败或参数无法获取。

假设我们有一个如下的控制器方法:

@DeleteMapping("/singer/delete/{id}")
public R deleteSinger(Integer singerId) {
    return singerService.deleteSinger(singerId);
}

在这个例子中,@PathVariable("id") 没有指定,Spring 可能会无法正确绑定 URL 中的 id 参数到 singerId 变量。原因在于,Spring 默认是通过反射来推测方法参数名的,但如果类在编译时没有保留参数名(即没有加上 -parameters 编译器标志),Spring 就无法知道方法参数的实际名字,导致绑定失败。

为什么要这样解决

1. 参数名称丢失

Java 编译器默认不会保存方法参数的名称。如果不加上 -parameters 标志,编译后的 .class 文件中,方法的参数名将变成默认的 arg0, arg1, arg2 等。这会导致 Spring 无法通过反射来识别参数名,进而无法进行正确的参数绑定。

2. Spring 使用反射获取参数

Spring 在解析控制器方法时,依赖反射来获取方法的参数信息。如果没有 -parameters,Spring 无法通过反射获取到真实的参数名称。Spring 只能通过参数的类型和顺序来进行匹配,但这种方式在参数顺序或类型复杂时容易出错。

3. 解决了参数名推断问题

启用 -parameters 标志后,编译器会将方法参数的名称保存在字节码中,Spring 可以通过反射直接获取到这些名称。这使得 Spring 在执行请求映射时,能够更准确地绑定 URL 中的参数到控制器方法中的参数。

总结

在 Spring Boot 项目中,如果我们没有在编译时启用 -parameters 标志,Spring 就无法获取到方法参数的实际名称,从而可能导致无法正确绑定请求参数。通过在 pom.xml 中配置 maven-compiler-plugin,启用 -parameters 标志,可以确保 Spring 正确地解析方法参数名称,避免出现绑定错误。

解决方案:

  • pom.xml 中配置 maven-compiler-plugin,并启用 -parameters 编译器标志。
  • 显式使用 @PathVariable("id") 等注解来指明参数名称,增强代码的健壮性和可读性。

通过这些措施,我们可以避免 Spring Boot 项目中的参数绑定问题,使得项目在处理请求时更加稳定可靠。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐