Java基础、中级、高级、架构面试资料

Ollama + GraalVM 终于不崩了!Spring AI 1.1.7 正式发布!

JAVA herman 16浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
【腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

这个月是 Spring 生态的密集发布月,光是 Spring AI 都发布了好几个版本了。

这不,上周五,Spring AI 团队就连发 3 个版本,分别是 1.1.7、1.0.8(维护线)、2.0.0-M7。由于当前的主流版本是 1.1.x 版本,因此,接下来本文就带领大家一起来看看这次的 Spring AI 1.1.7 有哪些变化。

版本概览

由于 Spring AI 2.x 正式版将于本月推出,因此其它的两个 1.x 主线和维护线版本几乎不再增加新功能了,以稳定性、bug 修复、漏洞修复为主。

2026 年 5 月 23 日,Spring AI 团队正式发布了 1.1.7 版本,与 1.0.8(维护线)和 2.0.0-M7(里程碑线)同步推出。这次发布并非功能大爆炸,而是一次以稳定性、安全性和兼容性为核心的精准维护更新。对于正在生产环境使用 Spring AI 1.1.x 的开发者来说,这是一次强烈建议立即升级的版本。

与 2.0.0-M7 的“颠覆式创新”不同(如废弃 SSE 传输协议、ToolCallAdvisor 成为默认工具调用方式等),1.1.7 的定位非常明确,修复关键 Bug、堵住安全漏洞、解决兼容性痛点。这也相当于告诉社区,1.x 稳定线依然在积极维护,生产环境可以放心依赖。

文章配图参见 https://mp.weixin.qq.com/s/MBp8QenN4v8_juSdlB0gMQ

三大核心更新详解

修复 CVE-2026-41863

这是本次升级的最重要理由,没有之一。因为 CVE-2026-41863 是一个高危漏洞。

漏洞背景

Spring AI 在支持 Anthropic 的 Skills API(智能体技能 API)时,存在一个路径遍历(Path Traversal)漏洞。当使用 Anthropic 模型生成文档(如 DOCX、PDF、PPTX、XLSX)时,模型返回的文件名会被直接用于 Path.resolve() 操作,未经过任何净化处理。

攻击原理

由于文件名由 LLM 生成,攻击者可以通过构造特定的 Prompt,诱导模型返回包含路径遍历序列的文件名。已有网友通过 prompt 的形式获得类型下方这样的文件信息。

../../../etc/passwd
../../../.ssh/authorized_keys

这个漏洞导致,Spring AI 会将这些文件写入到预期目录之外。从而引起下面这些问题。

  • 敏感文件被覆盖(如系统配置、SSH 密钥)
  • 恶意文件被植入(如 Web Shell、启动脚本)
  • 权限提升(写入受限目录)

这是一个典型的 Agent SkillSlip 类漏洞,与近期在 Gemini CLI、Claude Code 等 AI 工具中发现的路径遍历问题属于同一攻击面。

影响范围与修复

根据官网的信息可知,这个漏洞影响范围与修复情况,如下所示。

  • 影响版本:Spring AI 1.1.0 到 1.1.6 之间的所有版本
  • 修复版本:1.1.7(1.0.x 不受此漏洞影响,因为 Skills API 是 1.1.x 引入的功能)
  • CVSS 评分:Medium(AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:N),攻击复杂度低,但需认证权限
  • 修复方式:对 LLM 返回的文件名进行严格的输入验证和路径净化,确保解析后的路径始终位于目标目录内

官方建议,如果你的应用使用了 spring-ai-starter-model-anthropic 并启用了 Skills 功能,请立即升级至 1.1.7,并审计过去生成的文件记录。

新特性

新特性方面,Ollama 正式支持 GraalVM 原生镜像。

这对于追求极致启动速度和内存占用的云原生开发者来说,是一个期待已久的修复

问题现象

在 1.1.7 之前,使用 Spring AI 集成 Ollama 的开发者如果尝试构建 GraalVM Native Image,会遇到运行时反射相关的错误。根本原因在于 Ollama 模块中的 ThinkOption 序列化/反序列化类(ThinkOptionDeserializerThinkOptionSerializer)未被注册到 GraalVM 的反射配置中。

技术细节

GraalVM Native Image 在构建时会进行封闭式世界分析(Closed-World Analysis),所有需要反射访问的类必须显式声明。有社区开发者发现,需要手动注册以下类型才能 workaround。

// 1.1.6 及之前版本需要手动添加的 workaround
for (var c : new Class[]{
    ThinkOption.ThinkOptionDeserializer.class,
    ThinkOption.ThinkOptionSerializer.class
}) {
    hints.reflection().registerType(c, MemberCategory.values());
}

在 1.1.7 中,Spring AI 团队内置了这些 RuntimeHints,开发者无需再手动配置即可直接构建 Ollama + GraalVM 的原生镜像。

实际收益

从官方给出的数据可知。

  • 启动时间:从 JVM 模式的数秒降至原生镜像的毫秒级
  • 内存占用:典型场景下内存减少 50% 以上
  • 云原生适配:完美适配 AWS Lambda、Azure Functions、Knative 等 Serverless 场景
  • 边缘部署:更适合资源受限的 IoT 和边缘计算环境

修复 OpenAI 流式传输丢数据问题

这是一个隐蔽但影响深远的 Reactive Streams 行为问题,可能导致 AI 应用的输出内容不完整或顺序错乱

原先,OpenAiChatModel 在流式响应(Streaming)处理中,内部使用了 switchMap 操作符。当开发者在业务层对流进行缓冲处理(如 buffer(2))后接 concatMap 时,会出现数据块丢失的现象。

switchMap 的核心特性是,当新的上游事件到达时,自动取消(cancel)之前的内部流订阅。这在“搜索建议”等场景下是理想行为,但在流式聊天场景中却是灾难。

Token 1 arrives → switchMap starts processing
Token 2 arrives (50ms later) → switchMap CANCELS Token 1's processing
Token 3 arrives → switchMap CANCELS Token 2's processing
...

当业务层使用 buffer(2).concatMap(...) 进行批量安全校验或日志记录时,由于 switchMap 的取消机制,导致部分 Token 在传递到下游之前就被丢弃了。

修复方案

Spring AI 团队将内部的 switchMap 替换为更适合流式场景的运算符(如 concatMapflatMapSequential),从而确保以下几个方面的问题得到修复。

  • 所有 Token 按序处理,不丢失任何数据块
  • 与下游的 buffer + concatMap 模式兼容
  • 保持背压(Backpressure)安全

因此,如果你的应用有以下特征,官方也强烈建议验证并升级。

  • 使用 OpenAiChatModel.stream() 进行流式输出
  • 对流进行了 buffer()window()groupBy() 等分批操作
  • concatMap 中执行了异步校验、日志记录或副作用操作
  • 发现 AI 返回的内容偶尔“缺字少句”或逻辑不连贯

其他修复与改进

RedisVectorStore 删除操作截断问题

在 1.1.7 中修复了 RedisVectorStore#doDelete 的一个隐蔽 Bug,批量删除时仅删除前 10 条消息。这个问题在 1.0.8 中同样存在并已修复。

该 bug 的影响是,如果你使用 Redis 作为向量存储,并且需要批量删除大量文档,之前的版本可能导致“假删除”,看起来执行了删除,实际上大部分数据仍在 Redis 中。

这会造成:

  • 向量存储空间持续增长
  • 检索结果包含已标记删除的“幽灵文档”
  • RAG(检索增强生成)的上下文污染

1.1.7 vs 2.0.0-M7

Spring AI 目前并行维护三个版本线,1.1.7 的发布体现了团队对稳定线的承诺。

维度1.0.8(维护线)1.1.7(稳定线)2.0.0-M7(里程碑线)
定位长期支持,仅修复功能稳定,修复 + 小特性快速迭代,可能引入 Breaking Changes
Spring Boot3.2.x3.3.x / 3.4.x4.0.x
新特性Ollama + GraalVMToolSpec API、MCP HTTP 传输
安全修复CVE-2026-41863CVE-2026-41863
Breaking Changes有(SSE 废弃、PromptChatMemoryAdvisor 移除等)
生产建议遗留系统维持推荐用于生产仅评估,不建议生产

升级指南

升级指南方面,和以往类似。先进行 Maven 依赖更新。

<!-- 更新前 -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-bom</artifactId>
    <version>1.1.6</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

<!-- 更新后 -->
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-bom</artifactId>
    <version>1.1.7</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

然后再进行升级检查清单,包括以下几个方面。

  • 安全审计:如果使用了 Anthropic Skills API,检查历史文件生成记录
  • 流式功能测试:验证 OpenAiChatModel.stream() 在业务缓冲逻辑下的完整性
  • Ollama + GraalVM 测试:移除之前的手动 RuntimeHintsRegistrar,验证原生镜像构建
  • Redis 向量存储:执行批量删除测试,验证是否全部生效
  • 回归测试:运行核心对话流程,确认无行为退化

目前,从社区讨论来看,1.1.7 的发布获得了不少老外的积极反馈。我摘录了点赞比较高的 3 条评论,如下所示。

  1. 终于等到 Ollama 的 GraalVM 支持,这是 GitHub Issues 上被反复提及的需求,本地部署 Ollama 的开发者现在可以真正享受原生镜像的启动速度优势。
  2. 流式丢数据的问题困扰了我们两周,有开发者表示,在复杂的 Reactive 管道中,这个 switchMap 问题极难定位,1.1.7 的修复解决了他们的燃眉之急。
  3. 安全修复很及时,随着 AI Agent 攻击面的扩大,Skills API 的路径遍历问题提醒开发者,LLM 的输出不可信任,必须像对待用户输入一样进行严格的输入验证。

总结

Spring AI 1.1.7 是一次小而精的维护发布,它修复了三个不同维度的重要问题。

问题类型具体内容紧急程度
安全CVE-2026-41863 路径遍历漏洞立即升级
兼容性Ollama 支持 GraalVM 原生镜像强烈建议
稳定性OpenAI 流式传输丢数据强烈建议
数据一致性RedisVectorStore 批量删除截断建议升级

总的来说,Spring AI 现在迭代比较快,如果有漏洞则强烈建议升级;如果有你们遇到的 bug,则也建议升级;如果你们还没有 AI 落地,建议把 loading 换成 thinking …

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

本文原文出处:业余草: » Ollama + GraalVM 终于不崩了!Spring AI 1.1.7 正式发布!