Spring AI 1.0.0 + ChromaDB 最新版踩坑:Collection does not exist 404 报错全记录

报错信息

复制代码
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'chromaVectorStore':
Collection [goods_info] does not exist

Caused by: java.lang.RuntimeException: Collection [goods_info] does not exist
    at org.springframework.ai.chroma.vectorstore.ChromaApi.getCollection(ChromaApi.java:235)
    at org.springframework.ai.chroma.vectorstore.ChromaVectorStore.afterPropertiesSet(ChromaVectorStore.java:121)

Caused by: org.springframework.web.client.HttpClientErrorException$NotFound: 404 Not Found:
    "{"error":"NotFoundError","message":"Collection [goods_info] does not exist"}"

环境信息

  • Spring AI BOM:1.0.0
  • ChromaDB:最新版(docker chromadb/chroma:latest
  • 依赖:spring-ai-starter-vector-store-chroma

问题根因

根因一:Spring AI 1.0.0 源码中有一个字符串比对 bug

ChromaApi.getCollection 方法里,捕获异常时做了如下判断:

java 复制代码
if (String.format("Collection [%s] does not exists", collectionName).equals(msg)) {
    return null;
}

注意这里是 does not exists(语法错误,多了一个 s)。

而 ChromaDB 最新版实际返回的错误消息是:

复制代码
Collection [goods_info] does not exist

(没有 s)

两个字符串不匹配,导致异常没有被正确捕获,直接向上抛出 RuntimeException,应用启动失败。

根因二:afterPropertiesSet 强制执行检查

ChromaVectorStore 实现了 InitializingBean,Spring 在 Bean 初始化完成后会自动调用 afterPropertiesSet(),其内部强制调用了 getCollection() 做存在性校验,无论 initializeSchema 设置为 true 还是 false 都会执行,无法跳过。

这意味着即使 collection 确实存在,只要版本不匹配导致错误消息字符串对不上,就会一直报错。


排查过程

  1. 首先怀疑 host 配置缺少 http:// 协议头 → 修复后报新错误
  2. 怀疑 collection 不存在 → curl 手动创建,发现代理拦截导致请求没发出去
  3. 绕过代理 --noproxy '*' 后确认 collection 已创建(409 Conflict)
  4. 降级 Chroma 到 0.5.23 → API 路径从 v1 变成 v2,请求格式又不兼容
  5. 尝试反射绕过 afterPropertiesSetbuild() 内部就触发了,时机来不及
  6. 最终定位到源码字符串 bug → 升级 Spring AI BOM 到 1.1.4 彻底解决

解决方案

✅ 最终方案:升级 Spring AI BOM 到 1.1.4

xml 复制代码
<spring-ai.version>1.1.4</spring-ai.version>

1.1.x 版本修复了该字符串比对 bug,initializeSchema(true) 会正确自动创建 collection。

配置文件(application.properties)

properties 复制代码
# OpenAI 大模型
spring.ai.openai.api-key=your-api-key
spring.ai.openai.base-url=https://api.openai.com
spring.ai.openai.chat.options.model=gpt-4o
spring.ai.openai.chat.options.temperature=0.7
spring.ai.openai.embedding.options.model=text-embedding-ada-002

# Chroma 向量数据库
spring.ai.vectorstore.chroma.client.host=http://192.168.0.x
spring.ai.vectorstore.chroma.client.port=8321
spring.ai.vectorstore.chroma.tenant-name=default_tenant
spring.ai.vectorstore.chroma.database-name=default_database

配置类(ChromaConfig.java)

java 复制代码
@Configuration
public class ChromaConfig {

    @Bean
    public ChromaVectorStore chromaVectorStore(ChromaApi chromaApi, EmbeddingModel embeddingModel) {
        return ChromaVectorStore.builder(chromaApi, embeddingModel)
                .collectionName("goods_info")
                .initializeSchema(true)
                .build();
    }
}

Docker 启动 ChromaDB

bash 复制代码
docker run -d \
  --name chroma \
  -p 8321:8000 \
  -v /your/data/path:/chroma/chroma \
  chromadb/chroma:latest

注意事项

  • host 必须带 http:// 协议头,不能只写 IP
  • 如果服务器上有 http_proxy 环境变量,curl 请求会走代理,需要加 --noproxy '*' 绕过
  • tenantdatabase 使用 default_tenant / default_database 开箱即用,无需手动创建
  • collection 相当于数据库中的表,initializeSchema(true) 会在启动时自动创建
相关推荐
FrameNotWork几秒前
HarmonyOS6.1 从图像分类到目标检测的扩展实现
人工智能·harmonyos
夕除8 分钟前
AOP 实现 Redis 缓存切面解析
java·开发语言·python
智联物联9 分钟前
办公楼转型养老公寓,边缘计算网关实现全场景智慧监护
人工智能·边缘计算·物联网解决方案·工业网关·智慧养老·数采网关·边缘盒子
库拉大叔10 分钟前
工具调用效率对比实测:GPT-5.5与Gemini 3.5 Flash性能评估
java·前端·人工智能
我是唐青枫14 分钟前
Java MyBatis 实战指南:XML 映射、动态 SQL 与数据访问层设计
java·mybatis
摇滚侠16 分钟前
Spring 零基础入门到进阶 面向切面 AOP 52-60
java·后端·spring
就改了24 分钟前
微服务接口性能优化:CompletableFuture 并行聚合实践
java·微服务·性能优化
智讯天下26 分钟前
专业的高端智能照明品牌哪家好?从光学技术、系统稳定性、设计认证、服务保障四个维度看
人工智能·智能手机
林森lsjs26 分钟前
【日耕一题】4. 较为复杂情况下的求和
java·开发语言