核心内容摘要
告别付费墙,畅享无限精彩——“44444在线观看免费的电视软件”全攻略
在使用 Spring Boot LangChain4j 开发 AI 应用时在 Service 工厂中注入如下两个BeanResourceprivateStreamingChatModelopenAiStreamingChatModel;ResourceprivateStreamingChatModelreasoningStreamingChatModel;一切看起来都很合理但启动时就报如下错误❌Bean namedopenAiStreamingChatModelis expected to be oftypedev.langchain4j.model.chat.StreamingChatModelbut was actually oftypedev.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 认为这是两个完全无关的类。
即使包名、类名、继承关系都对也无法进行类型转换或赋值。
解决方案
在项目的如下目录中创建文件src/main/resources/META-INF/spring-devtools.properties
文件内容如下主要目的是告诉 DevTools这些 jar 属于基础类路径统一用Base ClassLoader加载。
restart.include.langchain4j/langchain4j-.*\.jar restart.include.openai/openai-.*\.jar