springboot 使用 dev tool 導致 CastException
阿新 • • 發佈:2020-07-27
1、背景
專案使用了 Spring + shiro 實現 許可權控制, 使用AOP 對 每個 Controller 進行 log 記錄時,需要從 shiro 中 獲取 username欄位, 問題就這樣出現了。
UserDO userDO = (UserDO) SecurityUtils.getSubject().getPrincipal();
出現 java.lang.ClassCastException: com.xxx.common.dal.dataobject.UserDO cannot be cast to com.xxx.common.dal.dataobject.UserDO
心裡一驚,這怎麼回事,這段程式碼我看其他地方也有些的。難道前面的沒有問題??
- 策略一:
- 立馬debug 試了一下以前的程式碼,發現 都沒有進入,一直沒有呼叫。
-
-
策略二: google
- 顯示關鍵字 查了 `SecurityUtils.getSubject().getPrincipal();`` 發現一堆的文章,沒有說不能正常的 cast的問題。 要 懷疑人生了!!!
- 不停的查,終於看到一篇 springboot dev tool 引起的 CastException 問題(Idea開啟springboot 熱載入,導致的Shiro型別轉換異常) [https://juejin.im/post/5da46ac1e51d457806260f1a
- 立馬 專案中搜索 是否引用了 de v tool,發現確實是用了,立馬 註釋掉 測試。
- 完美的執行了。
- 查了下 de v tool 的一些資訊,發現他會 使用 RestartClassloader. 官網也有相應的說明。https://docs.spring.io/spring-boot/docs/1.5.16.RELEASE/reference/html/using-boot-devtools.html
-
反思:
-
看到 異常資訊,並且 類的許可權定名都一樣,應該要 想到 肯能是 classLoader 的問題了,這是基礎,但 在實際中 卻不能很好的應用 知識。
-
-
花了我好久的時間來排查這個問題,真是太 low b了。