devtools導致的型別轉換異常處理方法
問題描述:
system.user.model.User cannot be cast to system.user.model.User
用了SpringBoot,整合了 Shrio 來做使用者的認證和授權,也引入了Mybatis的通用外掛等等。
起初並沒有遇到什麼困難,用Shiro的session管理來實現,使用的sessionDao層實現主要用的還是RedisSessionDAO。登入認證一切OK。但是當我去修改快取時候,需要從session當中將物件的屬性取出來的時候(此時為Object型別),再轉成對應的型別就發生了型別轉換異常(不是同一型別),我的心情就像怎麼證明你是你一樣,查了查資料,說是ClassLoader的問題。
嘗試了一系列的測試都無果後,原本已經打算放棄了。想著從 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
第三種處理方法,自己手動轉換或者每次手動重新整理快取:
public static User getUser() { Object obj = getSubjct().getPrincipal(); User user = new User(); if(obj instanceof User) { user = (User) obj; } else { user = JSON.parseObject(JSON.toJSON(obj).toString(), User.class); } // return (User) getSubjct().getPrincipal(); return user; }