天天看点

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

继续阅读