1. 程式人生 > >devtools導致的型別轉換異常處理方法

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;
    }