SpringBoot 整合 Shiro 過程中遇到奇怪的類型轉換問題


  起初並沒有遇到什么困難,用Shiro的session管理來實現,使用的sessionDao層實現主要用的還是RedisSessionDAO。登錄認證一切OK。但是當我去修改緩存時候,需要從session當中將對象的屬性取出來的時候(此時為Object類型),再轉成對應的類型就發生了類型轉換異常(不是同一類型)。 
  上幾張圖說明我的問題。 
  這里寫圖片描述 
  這里的這個 objValue 拿到的實際上也是session中緩存的用戶的信息。 
  這里寫圖片描述 
  從上兩幅圖我們可以看到,這兩個是屬於同一類型的。 
  這里寫圖片描述 
  但是實際上在 Debug 調試 objValue instanceof User 這段代碼時候,其結果卻是 false ,出乎了我的意料。 
  然后我去掉 objValue instanceof User 這段代碼,讓程序進入這個判斷執行語句 User user = (User) objValue 就出現了以下錯誤。 
  這里寫圖片描述 
 這里寫圖片描述 
 我到這個異常的時候,我腦海中第一個想的就是:我的親爸爸不是我親爸爸? 
 

分析

  嘗試了一系列的測試都無果后,原本已經打算放棄了。想着從 shiro session 中取出來的對象實際上都是經過 redis 的反序列化之后取出來的,就順着思考會不會是類加載的問題。 
  查了一下之后,發現我項目啟動時候加載項目當中的類所使用到的加載器是 org.springframework.boot.devtools.restart.classloader.RestartClassLoader , 這是因為之前在項目當中引入了 spring-boot-devtools 這個熱部署包來提高效率。而我從 shiro session 取對象時候所用到的類加載器並不是這個,而是 sun.misc.Launcher.AppClassLoader ,從而導致我的類型的轉換的異常。

解決方法

  1. 不使用 spring-boot-devtools 熱部署 
  2.在 resources 目錄下面創建 META_INF 文件夾,然后創建 spring-devtools.properties文件,文件加上類似下面的配置:

restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM