Spring Boot 3.0.5 processAot任务报错排查求助
问题排查:Spring Boot 3.0.5 + Graal Native 执行processAot任务报错
java.lang.IllegalArgumentException: invalid type parameter: void 问题描述
将应用升级至Spring Boot 3.0.5并适配Graal Native,执行processAot任务时触发java.lang.IllegalArgumentException: invalid type parameter: void错误。已尝试更新/移除相关依赖、添加--stacktrace和--debug参数,但仍无法定位具体出错方法,需精准排查方案。
报错堆栈信息
Task :app:processAot 12:04:29.496 [main] DEBUG reactor.util.Loggers -- 使用Slf4j日志框架 2023-04-11 12:04:30.250 INFO app=security-token-service, traceId=, spanId=, t=background-preinit, class=org.hibernate.validator.internal.util.Version, HV000001: Hibernate Validator 8.0.0.Final . ____ _ __ _ _ /\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.0.5) 2023-04-11 12:04:30.335 INFO app=security-token-service, traceId=, spanId=, t=main, class=s.token.service.SecurityTokenServiceApplicationKt, 正在使用Java 17.0.6启动SecurityTokenServiceApplicationKt,PID为71943(启动路径:/Users/rgfirmino/workspace/security-token-service/app/build/classes/kotlin/main,启动用户rgfirmino,工作目录:/Users/rgfirmino/workspace/security-token-service/app) 2023-04-11 12:04:30.337 INFO app=security-token-service, traceId=, spanId=, t=main, class=s.token.service.SecurityTokenServiceApplicationKt, 未设置激活配置文件,默认使用"default"配置文件 Exception in thread "main" java.lang.IllegalArgumentException: invalid type parameter: void at org.springframework.javapoet.Util.checkArgument(Util.java:53) at org.springframework.javapoet.ParameterizedTypeName.<init>(ParameterizedTypeName.java:51) at org.springframework.javapoet.ParameterizedTypeName.<init>(ParameterizedTypeName.java:38) at org.springframework.javapoet.ParameterizedTypeName.get(ParameterizedTypeName.java:119) at org.springframework.beans.factory.aot.InstanceSupplierCodeGenerator.buildGetInstanceMethodForFactoryMethod(InstanceSupplierCodeGenerator.java:257) at org.springframework.beans.factory.aot.InstanceSupplierCodeGenerator.lambda$generateCodeForAccessibleFactoryMethod$2(InstanceSupplierCodeGenerator.java:228) at org.springframework.aot.generate.GeneratedMethod.<init>(GeneratedMethod.java:54) at org.springframework.aot.generate.GeneratedMethods.add(GeneratedMethods.java:112) at org.springframework.aot.generate.GeneratedMethods.add(GeneratedMethods.java:89) at org.springframework.beans.factory.aot.InstanceSupplierCodeGenerator.generateGetInstanceSupplierMethod(InstanceSupplierCodeGenerator.java:331) at org.springframework.beans.factory.aot.InstanceSupplierCodeGenerator.generateCodeForAccessibleFactoryMethod(InstanceSupplierCodeGenerator.java:227) at org.springframework.beans.factory.aot.InstanceSupplierCodeGenerator.generateCodeForFactoryMethod(InstanceSupplierCodeGenerator.java:206) at org.springframework.beans.factory.aot.InstanceSupplierCodeGenerator.generateCode(InstanceSupplierCodeGenerator.java:98) at org.springframework.beans.factory.aot.DefaultBeanRegistrationCodeFragments.generateInstanceSupplierCode(DefaultBeanRegistrationCodeFragments.java:206) at org.springframework.beans.factory.aot.BeanRegistrationCodeGenerator.generateCode(BeanRegistrationCodeGenerator.java:89) at org.springframework.beans.factory.aot.BeanDefinitionMethodGenerator.lambda$generateBeanDefinitionMethod$3(BeanDefinitionMethodGenerator.java:194) at org.springframework.aot.generate.GeneratedMethod.<init>(GeneratedMethod.java:54) at org.springframework.aot.generate.GeneratedMethods.add(GeneratedMethods.java:112) at org.springframework.aot.generate.GeneratedMethods.add(GeneratedMethods.java:89) at org.springframework.beans.factory.aot.BeanDefinitionMethodGenerator.generateBeanDefinitionMethod(BeanDefinitionMethodGenerator.java:188) at org.springframework.beans.factory.aot.BeanDefinitionMethodGenerator.generateBeanDefinitionMethod(BeanDefinitionMethodGenerator.java:109) at org.springframework.beans.factory.aot.BeanRegistrationsAotContribution.lambda$generateRegisterBeanDefinitionsMethod$2(BeanRegistrationsAotContribution.java:85) at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:721) at org.springframework.beans.factory.aot.BeanRegistrationsAotContribution.generateRegisterBeanDefinitionsMethod(BeanRegistrationsAotContribution.java:83) at org.springframework.beans.factory.aot.BeanRegistrationsAotContribution.lambda$applyTo$1(BeanRegistrationsAotContribution.java:67) at org.springframework.aot.generate.GeneratedMethod.<init>(GeneratedMethod.java:54) at org.springframework.aot.generate.GeneratedMethods.add(GeneratedMethods.java:112) at org.springframework.aot.generate.GeneratedMethods.add(GeneratedMethods.java:89) at org.springframework.beans.factory.aot.BeanRegistrationsAotContribution.applyTo(BeanRegistrationsAotContribution.java:66) at org.springframework.context.aot.BeanFactoryInitializationAotContributions.applyTo(BeanFactoryInitializationAotContributions.java:78) at org.springframework.context.aot.ApplicationContextAotGenerator.lambda$processAheadOfTime$0(ApplicationContextAotGenerator.java:58) at org.springframework.context.aot.ApplicationContextAotGenerator.withCglibClassHandler(ApplicationContextAotGenerator.java:67) at org.springframework.context.aot.ApplicationContextAotGenerator.processAheadOfTime(ApplicationContextAotGenerator.java:53) at org.springframework.context.aot.ContextAotProcessor.performAotProcessing(ContextAotProcessor.java:106) at org.springframework.context.aot.ContextAotProcessor.doProcess(ContextAotProcessor.java:84) at org.springframework.context.aot.ContextAotProcessor.doProcess(ContextAotProcessor.java:49) at org.springframework.context.aot.AbstractAotProcessor.process(AbstractAotProcessor.java:82) at org.springframework.boot.SpringApplicationAotProcessor.main(SpringApplicationAotProcessor.java:80) > Task :app:processAot FAILED
排查方案
1. 定位出错的工厂方法
从堆栈可知,错误发生在Spring AOT生成工厂方法实例代码时,传入了void作为泛型参数。需找出对应问题Bean:
- 添加
--info参数执行任务,查看Bean注册的详细日志,重点关注工厂方法相关的Bean - 排查所有自定义
@Bean方法,尤其是返回类型为void或泛型参数包含void的方法(比如错误定义Supplier<Void>类型的Bean) - 检查第三方依赖中的Bean定义,是否存在返回
void的工厂方法
2. 逐步简化配置定位问题
- 临时注释非核心Bean配置,逐个恢复,找到触发错误的Bean
- 移除所有自定义AOT相关配置或处理器,确认是否为自定义代码导致问题
3. 检查Kotlin代码特殊情况
项目基于Kotlin开发,需注意:
- Kotlin的
Unit类型对应Java的void,检查是否有Bean方法返回Unit,被Spring AOT处理时误判为void泛型参数 - 排查Kotlin扩展函数、委托Bean是否存在异常返回类型定义
4. 验证依赖兼容性
- 确保所有依赖版本与Spring Boot 3.0.5兼容(可通过Spring Boot Dependency Management确认)
- 重点检查Hibernate Validator、Reactor等依赖版本是否适配Spring Boot 3.0.x和Graal Native
内容的提问来源于stack exchange,提问作者Rafael Firmino
相关产品推荐
相关产品推荐

