【SpringBoot】 整合 Shiro 过程当中遇到奇怪的类型转换问题

遇到问题

  最近在忙着从新给公司的系统搭建框架,用了 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

 ![这里写图片描述](http://img.blog.csdn.net/20180131183753474?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRGhfQ2hhbw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
 我到这个异常的时候,我脑海中第一个想的就是:个人亲爸爸难道不是我亲爸爸?
 

问题缘由

  尝试了一系列的测试都无果后,本来已经打算放弃了。想着从 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
相关文章
相关标签/搜索