Spring AI 1.0.0-M6与Spring Cloud 4.2.1兼容问题:OpenAI客户端JSON解析错误
问题分析
你遇到的是Spring AI 1.0.0-M6与Spring Cloud 4.2.1(Eureka Client/Config Client)的兼容问题,核心原因是Spring Cloud的自动配置会修改HTTP客户端的行为,比如添加服务发现拦截器、负载均衡拦截器等,这些拦截器会干扰Spring AI调用OpenAI的HTTP请求,导致响应被截断或无法正常解析,最终抛出JsonEOFException(JSON输入意外结束)。
解决方案
以下是几种可行的修复/规避方案:
1. 手动构建Spring AI的OpenAiApi客户端
绕过Spring Cloud对HTTP客户端的自动配置,手动创建不受干扰的RestClient实例来初始化OpenAiApi:
import org.springframework.ai.openai.api.OpenAiApi; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.web.client.RestClient; @Configuration public class OpenAiConfig { @Bean public OpenAiApi openAiApi(@Value("${spring.ai.openai.api-key}") String apiKey) { // 手动构建RestClient,不依赖Spring Cloud的自动配置 RestClient restClient = RestClient.builder() .baseUrl("https://api.openai.com/v1") .defaultHeader(HttpHeaders.AUTHORIZATION, "Bearer " + apiKey) .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE) .build(); return new OpenAiApi(restClient); } }
此方法直接隔离了Spring Cloud对OpenAI请求的影响,确保调用OpenAI时使用独立的HTTP客户端实例。
2. 配置Spring Cloud忽略外部服务
通过配置让Spring Cloud的负载均衡拦截器跳过对OpenAI域名的请求,在application.yml或application.properties中添加:
spring: cloud: loadbalancer: ignored-services: "api.openai.com"
该配置告诉Spring Cloud负载均衡组件不要处理针对api.openai.com的请求,避免拦截器干扰OpenAI响应的解析。
3. 排除特定Spring Cloud自动配置类
如果需要保留Spring Cloud核心功能,但要移除干扰HTTP客户端的配置,可以在启动类上排除相关自动配置:
@SpringBootApplication(exclude = { org.springframework.cloud.client.loadbalancer.LoadBalancerAutoConfiguration.class, org.springframework.cloud.loadbalancer.config.LoadBalancerAutoConfiguration.class }) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
注意:此方法可能影响Spring Cloud内部服务的负载均衡功能,仅在不需要内部服务负载均衡时使用。
验证方法
实现任一方案后,重启项目并调用OpenAI聊天接口:
- 若错误消失,说明问题已解决
- 若仍存在异常,可增加日志打印HTTP请求/响应的完整内容,排查是否有其他组件(如链路追踪)的拦截器干扰。
内容的提问来源于stack exchange,提问作者Zuzzuz
相关产品推荐
相关产品推荐

