Spring Boot + LangChain4j 报错:Bean 类型不匹配的解决办法

在使用 Spring Boot + LangChain4j 开发 AI 应用时,在 Service 工厂中注入如下两个Bean:

java 复制代码
@Resource
private StreamingChatModel openAiStreamingChatModel;

@Resource
private StreamingChatModel reasoningStreamingChatModel;

一切看起来都很合理,但启动时就报如下错误❌:

bash 复制代码
Bean named 'openAiStreamingChatModel' is expected to be of type 'dev.langchain4j.model.chat.StreamingChatModel' but was actually of type 'dev.langchain4j.model.openai.OpenAiStreamingChatModel'

最诡异的是 OpenAiStreamingChatModel 明明是 StreamingChatModel 的子类,期望类型和实际类型"看起来完全兼容",但还是报错!

原因分析

这个错误的根源,其实不是代码逻辑的问题,而是 spring-boot-devtools 的热部署机制导致的类加载冲突。

Spring Boot DevTools 为了实现快速重启,使用了两个类加载器。

一个是Base ClassLoader ,主要负责加载Spring Boot 框架、第三方 jar(比如 langchain4j-core.jar);

另一个是Restart ClassLoader,主要负责加载自己的项目代码(比如src/main/java)。

默认情况下,DevTools 会把 所有非项目代码的 jar 放入 Base ClassLoader

但是!

LangChain4j 这类库,通过 Maven 引入,它其实是属于"第三方依赖",理应由 Base ClassLoader 加载。

然而,在某些版本或配置下,DevTools 可能错误地将部分 LangChain4j 类交给了 Restart ClassLoader

这样就造成同一个类,有两个身份,这样 JVM 认为这是两个完全无关的类。即使包名、类名、继承关系都对,也无法进行类型转换或赋值。

解决方案

1.在项目的如下目录中创建文件:

bash 复制代码
src/main/resources/META-INF/spring-devtools.properties

2.文件内容如下,主要目的是告诉 DevTools,这些 jar 属于基础类路径,统一用 Base ClassLoader 加载。

bash 复制代码
restart.include.langchain4j=/langchain4j-.*\.jar
restart.include.openai=/openai-.*\.jar

3.重新运行,问题解决。

相关推荐
yunhuibin20 分钟前
GoogLeNet学习
人工智能·python·深度学习·神经网络·学习
易辰君1 小时前
【Python爬虫实战】正则:中文匹配与贪婪非贪婪模式详解
开发语言·爬虫·python
秀儿还能再秀1 小时前
正则表达式核心语法 + Python的 re 库中常用方法
python·正则表达式
xcLeigh1 小时前
Python入门:Python3 正则表达式全面学习教程
python·学习·正则表达式·教程·python3
多恩Stone2 小时前
【C++ debug】在 VS Code 中无 Attach 调试 Python 调用的 C++ 扩展
开发语言·c++·python
XW01059993 小时前
4-11判断素数
前端·python·算法·素数
J2虾虾3 小时前
Spring Boot中使用@Scheduled做定时任务
java·前端·spring boot
深蓝电商API3 小时前
爬虫增量更新:基于时间戳与哈希去重
爬虫·python
两万五千个小时3 小时前
构建mini Claude Code:06 - Agent 如何「战略性遗忘」(上下文压缩)
人工智能·python
两万五千个小时3 小时前
构建mini Claude Code:12 - 从「文件冲突」到「分身协作」:Worktree 如何让多 Agent 安全并行
人工智能·python·架构