StackTraces
Spring AI已驗證

Spring AI 報 NoSuchBeanDefinitionException

@debug_master32 天前更新閱讀 6 min00

這個 NoSuchBeanDefinitionException 不是普通的“你沒聲明 Bean”,而是 Spring AI 某些版本里把 VertexAiEmbeddingConnectionAutoConfiguration 的導入鏈條弄丟了。問題出在框架自動設定,不在你業務程式碼。

Issue & Env(案發現場與環境)

  • 業務場景:項目接入 Vertex AI Embedding,升級 Spring AI 後啟動失敗。
  • 已知線索:上游 issue #4875 明確指出,某次變更後 VertexAiEmbeddingConnectionAutoConfiguration 不再通過相關自動設定鏈路被導入。

StackTrace(堆疊日誌)

上游 issue 給出的例外是 NoSuchBeanDefinitionException,但如果用 @Value / 構造器注入,進入 Spring 容器後經常會先經過一層 BeanCreationException,完整堆疊是:

org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'vertexAiEmbeddingModel': Injection of autowired dependencies failed
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:782)
    at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:237)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1391)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1220)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:599)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:534)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1047)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type
'org.springframework.ai.vertexai.embedding.VertexAiEmbeddingConnectionDetails'
available: expected at least 1 bean which qualifies as autowire candidate.
Dependency annotations: {}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1804)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1363)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1318)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:911)

它往往出現在應用上下文初始化階段,而不是運行時調用階段。要定位是不是自動設定導入丟了,可以看啟動時的 CONDITIONS EVALUATION REPORT——VertexAiEmbeddingConnectionAutoConfiguration 顯示為 did not match,而報告裡並沒有提到顯式排除。

Reproduce(復現程式碼)

這類問題通常不是復現程式碼複雜,而是版本一升級就觸發。應用本身可能只是普通的 starter 設定:

<dependency>
  <groupId>org.springframework.ai</groupId>
  <artifactId>spring-ai-starter-model-vertex-ai-embedding</artifactId>
  <version>1.1.x</version>
</dependency>

應用程式碼甚至不用顯式寫任何 VertexAiEmbeddingConnectionDetails Bean,只靠 starter 的自動設定啟動。升級到受影響版本後,就會在啟動時直接報缺 Bean。

Root Cause(根因分析)

issue #4875 已經把根因說得很清楚:某次改動之後,VertexAiEmbeddingConnectionAutoConfiguration 以及一批類似的自動設定類,不再包含在相關 @ImportAutoConfiguration 註解裡;同時,它們也沒有被補進 org.springframework.boot.autoconfigure.AutoConfiguration.imports。

結果就是:

  1. 你的 starter 依賴還在;
  2. 業務程式碼沒變;
  3. 但 Spring Boot 自動設定鏈路裡,負責提供 VertexAiEmbeddingConnectionDetails 的那段丟了;
  4. 最終下游構造器注入時就只能拋 NoSuchBeanDefinitionException。

這類問題特別容易誤導人,因為例外長得像“你自己少寫了一個 Bean”,但實際上它是框架回歸。

The Fix(解決方案)

首選:升級到帶修復的版本

上游 PR #4990 的目的就是“Add missing auto-configuration classes”。維護者在 PR 評論裡明確說明,修復已經推到:

  • main
  • 1.1.x

也就是說,最佳方案不是自己長期打補丁,而是升級到包含該修復的版本。

臨時繞行:顯式導入缺失的自動設定

如果你當前還不能升級,可以按 issue #4875 的提示,手動把缺失的自動設定類補回來。例如:

@Configuration
@ImportAutoConfiguration(VertexAiEmbeddingConnectionAutoConfiguration.class)
class VertexAiEmbeddingFixConfiguration {
}

這個方案的本質是:既然框架沒自動導入,那就先由你顯式導入。

別誤把問題修成業務層 Bean

很多人看到 NoSuchBeanDefinitionException,第一反應是手寫一個同名 Bean。這個方向通常不推薦,因為:

  • 你補的是框架內部連接細節物件,不是業務接口;
  • 就算臨時補上,也可能繞開框架原本的裝配語義;
  • 後續一升級,又可能和官方修復衝突。

所以更穩的方向是“恢復正確的自動設定鏈路”,而不是“手搓一個假的替代 Bean”。

小結

  • VertexAiEmbeddingConnectionDetails 缺失,不一定是你業務程式碼的問題。
  • 這次問題的根因,是 Spring AI 某些版本里自動設定導入鏈條漏了。
  • 最穩的修復是升級到包含 PR #4990 的版本。
  • 臨時無法升級時,再顯式導入 VertexAiEmbeddingConnectionAutoConfiguration 兜底。

References(參考來源)

最後更新於 2026-09-09

這篇幫到你了嗎?

剛解決了一個棘手的報錯?花兩分鐘記錄下來,幫助下一個遇到同樣問題的開發者。

貢獻一條解法