把 Spring Boot 升到 4.x 再接 LangChain4j starter,应用起不来,挂在
ConfigurationClassPostProcessor阶段,报Failed to generate bean name for imported class。这不是 Bean 实例化出错,是配置类压根没注册上。维护者讨论过同一模块难兼容 3.x 与 4.x,截至撰写时适配仍在进行中。生产环境别硬升 4.x,先把 Spring Boot 锁回 3.5.x。
Issue & Env(案发现场与环境)
- 业务场景:Spring Boot 项目引入 LangChain4j 的 starter,想靠自动配置拿到模型 Bean,一启动就失败。
- 环境:Spring Boot 4.0(对应 Spring Framework 7),LangChain4j starter 按 Spring Boot 3.x 的约定编译,JDK 17+。
- 这里以
langchain4j-open-ai-spring-boot-starter为例,报错里的配置类是dev.langchain4j.openai.spring.AutoConfig。
StackTrace(堆栈日志)
报错原文(来自 issue #4268):
Caused by: java.lang.IllegalStateException: Failed to generate bean name for imported class 'dev.langchain4j.openai.spring.AutoConfig'
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.registerBeanDefinitionForImportedConfigurationClass(ConfigurationClassBeanDefinitionReader.java:172)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitionsForConfigurationClass(ConfigurationClassBeanDefinitionReader.java:145)
at org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(ConfigurationClassBeanDefinitionReader.java:124)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:458)
at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:310)
Reproduce(复现代码)
用 Spring Boot 4 的父 POM,再引 starter:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>4.0.0</version>
</parent>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
</dependency>
只要 starter 在 classpath 上,哪怕还没写模型配置,启动就会挂。
Root Cause(根因分析)
先看报错的位置。调用栈是 ConfigurationClassPostProcessor,属于 ApplicationContext refresh 的早期。这时还没走到实例化 Bean,框架正在读配置类。问题出在「读取配置类」这一步,跟模型参数、API key 都无关。
Spring Boot 4 随 Spring Framework 7 一起来。这一版对配置类处理和自动配置导入改动较大。LangChain4j starter 内部的 AutoConfig 仍按旧约定写,在 Spring Boot 4 下无法被正常注册为配置类,启动直接失败。
维护者讨论(issue #4268):同一个 langchain4j-spring 模块很难同时兼容 Spring Boot 3.x 与 4.x。讨论过「同一模块发两个版本」的方向。具体工作在 langchain4j-spring PR #153,仍属进行中。
一句话,截至撰写时 Spring Boot 4 支持还没修好,别当成已解决。
The Fix(解决方案)
短期最省事的做法是回退。把 Spring Boot 锁回 3.x,和 starter 的编译目标对齐:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.0</version>
</parent>
先确认依赖版本,再动手升级:
mvn dependency:tree -Dincludes=dev.langchain4j
./gradlew dependencies | grep -E "langchain4j|spring-boot"
看清 starter 的版本和 Spring Boot 的大版本。注意 Spring Boot 4 的 starter 坐标与包名,在大版本之间也可能变。
盯紧 langchain4j-spring PR #153 的合入进度。生产上别硬升 Spring Boot 4。
如果非要在 Spring Boot 4 上跑,目前只能不用官方 starter,手动声明模型 Bean:
@Configuration
public class ModelConfig {
@Bean
public OpenAiChatModel openAiChatModel() {
return OpenAiChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName("gpt-4o-mini")
.build();
}
}
代价是丢掉自动配置的便利。这属于 workaround,不推荐长期用。
小结
根子在版本。Spring Boot 4 改了配置类处理,LangChain4j starter 没跟上。短期锁回 3.5.x,长期等 PR #153。真要硬上 4.x,只能手写 Bean。
