這個
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。
結果就是:
- 你的 starter 依賴還在;
- 業務程式碼沒變;
- 但 Spring Boot 自動設定鏈路裡,負責提供
VertexAiEmbeddingConnectionDetails的那段丟了; - 最終下游構造器注入時就只能拋
NoSuchBeanDefinitionException。
這類問題特別容易誤導人,因為例外長得像“你自己少寫了一個 Bean”,但實際上它是框架回歸。
The Fix(解決方案)
首選:升級到帶修復的版本
上游 PR #4990 的目的就是“Add missing auto-configuration classes”。維護者在 PR 評論裡明確說明,修復已經推到:
main1.1.x
也就是說,最佳方案不是自己長期打補丁,而是升級到包含該修復的版本。
臨時繞行:顯式導入缺失的自動設定
如果你當前還不能升級,可以按 issue #4875 的提示,手動把缺失的自動設定類補回來。例如:
@Configuration
@ImportAutoConfiguration(VertexAiEmbeddingConnectionAutoConfiguration.class)
class VertexAiEmbeddingFixConfiguration {
}
這個方案的本質是:既然框架沒自動導入,那就先由你顯式導入。
別誤把問題修成業務層 Bean
很多人看到 NoSuchBeanDefinitionException,第一反應是手寫一個同名 Bean。這個方向通常不推薦,因為:
- 你補的是框架內部連接細節物件,不是業務接口;
- 就算臨時補上,也可能繞開框架原本的裝配語義;
- 後續一升級,又可能和官方修復衝突。
所以更穩的方向是“恢復正確的自動設定鏈路”,而不是“手搓一個假的替代 Bean”。
小結
VertexAiEmbeddingConnectionDetails缺失,不一定是你業務程式碼的問題。- 這次問題的根因,是 Spring AI 某些版本里自動設定導入鏈條漏了。
- 最穩的修復是升級到包含 PR #4990 的版本。
- 臨時無法升級時,再顯式導入
VertexAiEmbeddingConnectionAutoConfiguration兜底。
