最近在忙着从新给公司的系统搭建框架,用了 SpringBoot,整合了 Shrio 来作用户的认证和受权,也引入了Mybatis 的通用插件等等。
起初并无遇到什么困难,用 Shiro 的 session 管理来实现,使用的 sessionDao 层实现主要用的仍是 RedisSessionDAO。登陆认证一切OK。可是当我去修改缓存时候,须要从 session 当中将对象的属性取出来的时候(此时为 Object 类型),再转成对应的类型就发生了类型转换异常(不是同一类型)。
上几张图说明个人问题。
这里的这个 objValue
拿到的实际上也是 session 中缓存的用户的信息。
从上两幅图咱们能够看到,这两个是属于同一类型的。
可是实际上在 Debug 调试 objValue instanceof User
这段代码时候,其结果倒是 false
,出乎了个人意料。
而后我去掉 objValue instanceof User
这段代码,让程序进入这个判断执行语句 User user = (User) objValue
就出现了如下错误。
java
 我到这个异常的时候,我脑海中第一个想的就是:个人亲爸爸难道不是我亲爸爸?
尝试了一系列的测试都无果后,本来已经打算放弃了。想着从 shiro session 中取出来的对象实际上都是通过 redis 的反序列化以后取出来的,就顺着思考会不会是类加载的问题。
查了一下以后,发现我项目启动时候加载项目当中的类所使用到的加载器是 org.springframework.boot.devtools.restart.classloader.RestartClassLoader
, 这是由于以前在项目当中引入了 spring-boot-devtools
这个热部署包来提升效率。而我从 shiro session 取对象时候所用到的类加载器并非这个,而是 sun.misc.Launcher.AppClassLoader
,从而致使个人类型的转换的异常。redis
1. 不使用 spring-boot-devtools
热部署
2.在 resources
目录下面建立 META_INF
文件夹,而后建立 spring-devtools.properties
文件,文件加上相似下面的配置:spring
restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar