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版本
- 在Spring Tool Suite中,打开项目属性 -> Java Build Path,确保JRE System Library使用Java 17
- 进入项目属性 -> Java Compiler,将编译器合规级别设置为17
- 配置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
相关产品推荐
相关产品推荐

