問題:
????????java.lang.ClassCastException: class ????????cn.best.scholarflow.framework.system.domain.entity.SysUser cannot be cast to class cn.best.scholarflow.framework.system.domain.entity.SysUser (cn.best.scholarflow.framework.system.domain.entity.SysUser is in unnamed module of loader 'app'; cn.best.scholarflow.framework.system.domain.entity.SysUser is in unnamed module of loader org.springframework.boot.devtools.restart.classloader.RestartClassLoader @79752146)
????????截圖無法顯示全部的錯誤
????????先說一說遇到的什么問題
????????你遇到的問題是由于Spring Boot的開發工具(DevTools)模塊中的熱更新特性導致的。當你在開發環境中啟用了spring-boot-devtools
,它會創建一個額外的類加載器來支持熱部署功能,這允許你在不重啟整個應用程序的情況下重新加載更改過的類和資源。然而,這種機制有時會導致類加載問題,比如你遇到的ClassCastException
異常。?
錯誤原因
????????這個問題的根本原因是RestartClassLoader
和應用程序默認類加載器之間的沖突。當你的應用運行時,RestartClassLoader
用于加載一些特定的類,而其他類則由默認的應用程序類加載器加載。如果這兩個類加載器都加載了同一個類(例如SysUser
),即使它們來自相同的包路徑,Java也會認為它們是不同的類型,因為每個類加載器加載的類被視為獨立的實體。因此,嘗試將一個類轉換為另一個會導致ClassCastException
。
解決方案
????????為了防止此類問題的發生,你可以通過禁用spring-boot-devtools
的自動重啟功能來解決問題。具體步驟如下:
打開IDEA:啟動IntelliJ IDEA并打開你的項目。
編輯配置:點擊頂部菜單欄的Run
,然后選擇Edit Configurations...
。
修改選項:在彈出的窗口中,選擇你正在使用的運行配置,然后點擊左下角的Modify options
按鈕。
添加VM選項:在彈出的子菜單中找到Add VM options
,點擊它。
輸入禁用命令:在出現的文本框中輸入以下內容以禁用自動重啟
-Dspring.devtools.restart.enabled=false
- 應用設置:完成上述設置后,點擊
Apply
按鈕保存更改,然后點擊OK
關閉窗口。
????????通過以上設置,spring-boot-devtools
的熱更新特性將被禁用,從而避免了因類加載器沖突而導致的ClassCastException
。不過,請注意,禁用此功能后,代碼更改將不再自動觸發應用重啟,你需要手動重啟應用以查看更改效果。