使用 IntelliJ IDEA 調試 Spring Boot 應用程式
1. 簡介
Spring Boot 只需包含少量相依性和極少的配置,即可輕鬆建立功能強大的應用程式。只需幾行程式碼,我們就可以設定 HTTP 端點、連接資料庫並處理事件。這感覺就像魔術一樣——直到出現問題。
當問題出現時,調試至關重要。然而,了解 Spring Boot 應用程式幕後發生的事情可能很棘手。配置值可能來自多個來源,Bean 可能會有條件地加載,且交易問題可能難以精確定位。
在解決問題時,我們多久會問自己一次這樣的問題:
- 實際使用的屬性值是什麼?
- 注入了哪一個 bean?
- 當前交易是否有效?
- 該應用程式連接到哪個資料庫?
在本教學中,我們將探討 IntelliJ IDEA 的Spring Debugger外掛程式如何為標準偵錯器添加特定於 Spring 的見解並簡化應用程式故障排除。
2. Spring Debugger 入門
Spring Debugger 不需要特殊配置 - 只需安裝插件並在Debug
模式下運行應用程式。
它適用於以下運行配置類型:
- 原生 IntelliJ IDEA
Spring Boot
- Maven
spring-boot:run
指令 - Gradle
bootRun
任務 - 仍然不支援遠端連線(截至 2025 年 8 月)
該插件與 IDE 的內建偵錯器 API 集成,無需使用 Spring Boot Actuator 或其他額外的程式庫或代理程式即可運作。
一旦我們安裝了它,我們就可以立即開始使用它的所有功能來探索應用程式在運行時內部發生的情況 - 從 bean 開始。
3.查看運行時載入了哪些 Bean
當我們開始調試 Spring 應用程式時,首先要問的問題之一是:實際載入了哪些 bean?
Spring Debugger 將特定於 bean 的圖示(根據 bean 類型區分)新增至Project
視圖:
如範例所示,我們有:
- 綠色代表豆子已滿
- 灰色表示已掃描但未加載的豆子
- 橘色代表假豆
這種視覺回饋在測試中或有多個實作可用時尤其有用。我們也可以從目前應用程式上下文中評估任何 Spring bean 。在Evaluate Expression
視窗中,自動完成功能可協助我們直接在 bean 上呼叫方法—無需更改程式碼或重新啟動。
一旦我們知道加載了哪些 bean,下一個挑戰通常是弄清楚為什麼應用程式的行為與我們預期的不同——這通常從配置開始。
4. 找到任何財產的真實價值
屬性並不總是按預期運行 - 它們的值可能取決於活動配置文件及其應用順序,或來自外部來源,例如環境變數或配置服務。
Spring Debugger在設定檔中內聯顯示有效屬性值。點擊它會導航到提供該值的來源,無論是檔案還是 Java 程式碼:
在偵錯會話期間,我們可以在Evaluate Expression
視窗中求值屬性。在這種情況下,我們不僅可以看到值,還可以看到來源,並且偵錯器會顯示值如何更新的堆疊追蹤。
對於環境變數、系統設定或配置伺服器,即使無法導航,IDE 也會提供清晰的來源描述:
確認配置正確後,故障排除的另一個常見步驟是確保應用程式連接到正確的資料庫。
5. 立即檢查資料庫連接
在執行整合測試時,應用程式連接到哪個資料庫並不總是很明顯 - 尤其是使用 Testcontainers 等工具時,連接埠和憑證可能會發生變化。
Spring Debugger 與資料庫工具視窗集成,可在執行時顯示活動連線。我們可以探索連接的容器或獨立資料庫中的數據,而無需猜測連接字串或掃描日誌:
對於記憶體資料庫,Spring Debugger 會顯示連接,但無法顯示架構或數據,因為這些資料庫僅存在於應用程式進程內部,如果沒有專用端點,則無法透過 IDE 的 JDBC 驅動程式存取。在這種情況下,我們可以暫停應用程式並使用 Bean(例如儲存庫、實體管理器)或直接取得連接物件來執行 SQL 或 JPQL 查詢。
即使資料庫連接正確,由於事務處理仍然可能出現問題 - 而且這些問題可能更難診斷。
6.診斷交易問題
常見的 Spring 錯誤是LazyInitializationException
,當我們在活動事務之外存取 JPA 實體時會發生這種情況。
在調試期間,Spring Debugger 顯示活動事務及其元資料— 它是否處於活動狀態、其傳播類型以及它的起始位置:
對於 JPA,它還會顯示已載入實體的 L1 緩存,這些快取會在我們單步執行程式碼時更新。有了這些訊息,我們可以清楚地看到事務邊界並發現違規行為。
如果交易處於活動狀態但資料仍未持久化或正確加載,我們可以檢查實體狀態。
7. 檢查JPA實體狀態
在 JPA 中,實體狀態至關重要。實體是被管理、分離還是移除,都會影響級聯、刷新操作以及持久化上下文的行為。
Spring Debugger 直接在偵錯器中顯示實體生命週期狀態。在任何斷點處,我們都可以確認實體是否已附加到目前會話:
當實體在服務之間傳遞時,此資訊有助於調試服務層中與持久性相關的問題。
透過結合所有這些功能(bean 檢查、屬性追蹤、資料庫連接檢查、事務元資料和實體狀態),我們可以全面了解應用程式在執行時間發生的情況。
8. 結論
在本文中,我們了解到調試 Spring Boot 通常意味著回答有關配置、接線、交易和持久性的問題。
Spring Debugger 外掛程式將這些答案直接帶入調試器和編輯器:
- 立即查看已載入的 bean 及其狀態
- 從應用程式上下文呼叫任何 bean
- 追蹤任何財產價值的真正來源
- 無需猜測即可查看活動的資料庫連接
- 一目了然地檢查交易和實體狀態
Spring Debugger 外掛程式作為單獨的插件提供,目前尚未與 IntelliJ IDEA 捆綁。這樣做的原因是,插件開發者不想依賴 IDEA 的發布週期,而是可以根據需要更新插件。
透過 Spring Debugger,執行時間洞察已成為我們常規調試流程的一部分。我們無需再在日誌、配置和資料庫工具之間來回切換來了解正在發生的事情。我們需要的一切——從 Bean 狀態到事務詳情——都在 IDE 中,幫助我們更快地解決問題。