You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot GraphQL示例项目运行抛出IllegalArgumentException求助

问题排查:Spring Boot GraphQL Starter 查询抛出 IllegalArgumentException

问题背景

运行Spring官方GraphQL Server示例项目,使用Java 17与Spring Tool Suite IDE,但IDE中Gradle编译器显示为Java 16。未修改任何官方代码,启动服务提交GraphQL查询后抛出异常,不确定Java 17与Spring 3.2.1是否存在兼容问题。

异常信息

ExceptionResolversExceptionHandler[0;39m [2m:[0;39m Unresolved IllegalArgumentException for executionId 558526c2-e382-1790-634f-ce88818aad13

java.lang.IllegalArgumentException: Name for argument of type [java.lang.String] not specified, and parameter name information not found in class file either.
    at org.springframework.graphql.data.method.annotation.support.ArgumentMethodArgumentResolver.getArgumentName(ArgumentMethodArgumentResolver.java:92) ~[spring-graphql-1.2.4.jar:1.2.4]
    at org.springframework.graphql.data.method.annotation.support.ArgumentMethodArgumentResolver.resolveArgument(ArgumentMethodArgumentResolver.java:69) ~[spring-graphql-1.2.4.jar:1.2.4]
    at org.springframework.graphql.data.method.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:81) ~[spring-graphql-1.2.4.jar:1.2.4]
    at org.springframework.graphql.data.method.annotation.support.DataFetcherHandlerMethod.getMethodArgumentValues(DataFetcherHandlerMethod.java:177) ~[spring-graphql-1.2.4.jar:1.2.4]
    at org.springframework.graphql.data.method.annotation.support.DataFetcherHandlerMethod.invoke(DataFetcherHandlerMethod.java:119) ~[spring-graphql-1.2.4.jar:1.2.4]

控制器代码

@Controller
public class BookController {
    @QueryMapping
    public Book bookById(@Argument String id) {
        return Book.getById(id);
    }

    @SchemaMapping
    public Author author(Book book) {
        return Author.getById(book.authorId());
    }
}

GraphQL查询语句

query bookDetails {
  bookById(id: "book-1") {
    id
    name
    pageCount
    author {
      id
      firstName
      lastName
    }
  }
}

Gradle构建配置

id 'java'
id 'org.springframework.boot' version '3.2.1'
id 'io.spring.dependency-management' version '1.1.4'

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '17'
    targetCompatibility = '17'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-graphql'
    implementation 'org.springframework.boot:spring-boot-starter-web'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'org.springframework:spring-webflux'
    testImplementation 'org.springframework.graphql:spring-graphql-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

解决方案

原因分析

异常核心原因是:编译生成的类文件中未保留方法参数名称信息,Spring GraphQL的ArgumentMethodArgumentResolver无法自动匹配GraphQL查询中的参数名id与方法参数名id,且未通过@Argument注解显式指定参数名称。Java默认编译时不会将参数名写入字节码,需额外配置或显式声明。

解决方法

方法1:显式指定@Argument参数名

修改控制器方法,在@Argument注解中明确指定参数名称,无需依赖字节码中的参数信息:

@QueryMapping
public Book bookById(@Argument("id") String id) {
    return Book.getById(id);
}

方法2:配置Gradle编译时保留参数名

在build.gradle的java块中添加编译选项,确保编译时保留参数名称到字节码:

java {
    sourceCompatibility = '17'
    targetCompatibility = '17'
    compileOptions {
        compilerArgs.add("-parameters")
    }
}

方法3:同步IDE与Gradle的Java版本

  1. 在Spring Tool Suite中,打开项目属性 -> Java Build Path,确保JRE System Library使用Java 17
  2. 进入项目属性 -> Java Compiler,将编译器合规级别设置为17
  3. 配置Gradle使用的JVM:在STS中,打开Window -> Preferences -> Gradle,设置Gradle JVM为Java 17

兼容性说明

Java 17与Spring Boot 3.2.1完全兼容,Spring Boot 3.x系列最低要求Java 17,因此版本匹配无问题,本次异常与版本兼容性无关。

内容的提问来源于stack exchange,提问作者sanvica

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 20:44:51