Spring AI 调 vLLM 报 400 错误?分块传输编码是坑,换 Jetty 客户端就通了

发布时间:2026/11/11 4:29:09

Spring AI 调 vLLM 报 400 错误?分块传输编码是坑,换 Jetty 客户端就通了 Spring AI 调 vLLM 报 400 错误分块传输编码是坑换 Jetty 客户端就通了【免费下载链接】spring-aiAn Application Framework for AI Engineering项目地址: https://gitcode.com/GitHub_Trending/spr/spring-ai根因是 vLLM 不认分块传输编码Chunked Transfer Encoding而 Spring AI 默认 HTTP 客户端正按分块方式发请求体Request Body调用直接吃 400 错误。最简修复把 RestClient、WebClient 底下的客户端换成 Jetty。报错现场vLLM 回 400说 body 字段缺失控制台里第一条报错长这样400 - {object:error,message:[{type: missing, loc: (body,), msg: Field required, input: None}],type:BadRequestError,param:null,code:400}人话翻译vLLM 没收到任何一个字节的请求体input 是 None它把这次请求当成“空请求”按缺字段拒掉了。和模型参数无关——body 根本没送到。我们当时跑的就是这种 DeepSeek 多轮对话第一轮请求就 400第二轮根本没发出去。排查回放从 URL 密钥查到分块传输编码先怀疑的是配置。baseUrl、apiKey、模型名逐项核对都对得上。顺手用 curl 直连同一个 vLLM 端点完整响应回来了。配置排除。再改调用方式切非流式、调 temperature 这类参数400 依旧。请求参数也排除。转折点是 vLLM 那侧的日志input: None。服务端确实没收到 body。嫌疑挪到传输层我拉出 Wireshark 看了 Spring AI 发出的原始请求。绕了一圈发现请求头里是 Transfer-Encoding: chunked而不是 Content-Length。body 被拆成块发出去了。坑就在这vLLM 的解析器只认事先声明长度的请求chunked 这种它直接当空 body 处理报错发生在模型被调用之前。原理拆解Content-Length 与分块传输编码的传输层差异说白了两条路径差一行请求头。curl 的 body 是内存里现成的字节长度提前知道头里写 Content-Length: 312body 整包送达。Spring AI 的客户端边序列化边发长度不确定时就切到分块传输把 body 拆成一块块发末尾加结束符。类比一下快递整包直发封条上写了总重分块传输是一车车拉最后一车写“运完”。vLLM 只认封条见不到封条就当空包裹拒收。再看报错格式是 pydantic 的校验输出vLLM 的 API 层拿到空 body校验器按必填字段缺失处理。所以这个 400 不是“参数错”是“信封格式不同”——东西在对方没收到。动手修复RestClient 和 WebClient 换 Jetty 客户端第一步加 Jetty 客户端及其响应式适配器。后者是给 WebClient 复用 Jetty 连接池的dependency groupIdorg.eclipse.jetty/groupId artifactIdjetty-client/artifactId /dependency dependency groupIdorg.eclipse.jetty/groupId artifactIdjetty-reactive-httpclient/artifactId /dependency第二步把 RestClient 的请求工厂换成 JettyClientHttpRequestFactory。非流式 chat() 调用走的是同步 RestClient换完它会回到带 Content-Length 的发送方式。第三步把 WebClient 的连接器换成 JettyClientHttpConnector。流式调用走这条路两处都得换只换一处会在另一条链路再次 400。完整配置如下baseUrl 和 apiKey 按你的 vLLM 地址填OpenAiApi openAiApi OpenAiApi.builder() .baseUrl(http://localhost:8000/v1) .apiKey(EMPTY) .restClientBuilder(RestClient.builder() .requestFactory(new JettyClientHttpRequestFactory())) .webClientBuilder(WebClient.builder() .clientConnector(new JettyClientHttpConnector())) .build();避坑清单自部署 OpenAI 兼容服务的 400 排查检查项☐ 报错带 Field required 且 input: None先认定 body 没送达别去动模型参数 ☐ 同端点 curl 直连一次直连通、Spring AI 不通嫌疑收窄到客户端传输层 ☐ 抓包看请求头有没有 Transfer-Encoding: chunked这是确认根因的关键证据 ☐ 对接自部署服务vLLM、LM Studio 之类先试换 HTTP 客户端再回头调参数 ☐ 关注 vLLM 上游对分块传输的支持修复修复落地后 Jetty 这套依赖可以撤掉回归默认客户端【免费下载链接】spring-aiAn Application Framework for AI Engineering项目地址: https://gitcode.com/GitHub_Trending/spr/spring-ai创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/9 7:14:15

oh-my-hermes:统一 Hermes 配置管理,让 React Native 性能优化更简单

1. 项目缘起:为什么我会折腾一套 Hermes 配置管理方案先交代一下背景。我一直在做 React Native 相关的性能优化工作,接触 Hermes 引擎其实比大多数人要早。Hermes 是 Facebook 专门为 React Native 打造的那套 JavaScript 引擎,它在 Android…

2026/11/11 4:27:46

特种作业证电力电缆千万别踩坑,外省证书怎么转过来?

特种作业证电力电缆千万别踩坑,外省证书怎么转过来? 之前考的证在外省能不能转过来?这可能是很多在外地打工、或者跨省发展的小伙伴最关心的问题。特别是在特种作业证电力电缆这个领域,很多人在外省考的证,回家乡或换城市之后,往往发现不被认可。这不是…

2026/11/11 4:27:46

电工证复审测试题2026河南最新政策下怎么准备不挂科

电工证复审测试题2026河南最新政策下怎么准备不挂科 实操考试心里没底怕挂科?别慌!2026河南最新政策已经明确,电工证复审测试题的考核内容、流程、以及培训方式都有了新变化。作为商丘房建工程从业者,很多一线电工都面临一个现实问题:复审测试如…

2026/11/11 4:27:46

菏泽在哪报考电工证网上查询攻略,工地太忙根本没时间复习考试

菏泽在哪报考电工证网上查询攻略,工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,这几乎是所有一线工人的共同烦恼。尤其在菏泽这样的施工活跃区域,很多电工证的报考者都是在工地上边干边学,根本没时间系统复习。但别急, 菏泽在哪报考电工证…

2026/11/11 4:22:46

晋中市特种工培训报名门槛低吗?2026河南最新政策全解析

晋中市特种工培训报名门槛低吗?2026河南最新政策全解析 你是不是也担心学历不高报不了晋中市特种工培训?其实不然,2026河南最新政策明确规定,只要年满18周岁、具备初中及以上学历、身体健康、无妨碍从事相应特种作业的疾病和生理缺陷,就完全符…

2026/11/10 8:12:38

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/11 0:02:26

考低压电工证通过率考试真题与备考技巧

低压电工证通过率高不高?学历不高也能考,值不值得考? 你是不是总听说电工证能帮你找高薪工作,但又担心自己学历不够,考不上?其实,低压电工证考试门槛并没有你想象中那么高,关键是方法对不对。这篇文章就告诉你, 考低压电工证通过率到底有多高 ,…

2026/11/11 0:02:26

低压电工证学时千万别踩坑,濮阳毕业生怎么避坑报名

低压电工证学时千万别踩坑,濮阳毕业生怎么避坑报名 你是不是也和我一样,刚毕业就听说低压电工证学时必须达标才能上岗?可一打听,发现报名机构五花八门,价格参差不齐, 不知道去哪报名怕被中介坑…

2026/11/10 20:08:15

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑