异常原因:
项目启动时候加载项目当中的类所使用到的加载器是 org.springframework.boot.devtools.restart.classloader.RestartClassLoader , 这是因为之前在项目当中引入了 spring-boot-devtools 这个热部署包来提高效率。而我从 shiro session 取对象时候所用到的类加载器并不是这个,而是 sun.misc.Launcher.AppClassLoader ,从而导致我的类型的转换的异常。
由于我使用shiro ,所以在使用
User user = (User) SecurityUtils.getSubject().getPrincipal();
会出现的异常:
exception:java.lang.ClassCastException:cn.system.model.User cannot be cast to cn.system.model.User,
一个User对象不能转换成另一个User
官方文档: https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-boot-devtools-customizing-classload
看 20.2.6 Customizing the Restart Classloader
解决办法:
不使用spring-boot-devtools热部署
在 resources 目录下面创建 META_INF 文件夹,然后创建 spring-devtools.properties文件,文件加上类似下面的配置:
restart.exclude.companycommonlibs=/mycorp-common-[\\w-]+\.jar restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar
可能是我姿势不太对,搞半天也是失败,先放弃,有时间再搞.
3. 直接在代码上修改(未尝试,先收藏)
Object obj = subject.getSession().getAttribute(LOGININFO); SysUserModel sysUserModel = new SysUserModel(); if(obj instanceof SysUserModel) { sysUserModel = (SysUserModel) obj; } else { sysUserModel = JSON.parseObject(JSON.toJSON(obj).toString(), SysUserModel.class); } return sysUserModel;
4. 利用反射获取属性(未尝试,先收藏)
我使用笨方法解决了,用反射获取属性,自己写了一个属性;/** * 用于redis session 使用了 spring devtools 导致的类型转换异常 * @param redisObj * @return*/public static SysUserEntity convertObjToEntity(Object redisObj) { SysUserEntity sysUserEntity = new SysUserEntity();sysUserEntity.setUserId(NumberUtils.toLong(ReflectUtils.getFieldValue(redisObj, SysUserEntity.FIELD_USERID)+"",0));sysUserEntity.setUsername(ReflectUtils.getFieldValue(redisObj, SysUserEntity.FIELD_USERNAME)+"");sysUserEntity.setPassword(ReflectUtils.getFieldValue(redisObj, SysUserEntity.FIELD_PASSWORD)+"");sysUserEntity.setEmail(ReflectUtils.getFieldValue(redisObj, SysUserEntity.FIELD_EMAIL)+"");sysUserEntity.setMobile(ReflectUtils.getFieldValue(redisObj, SysUserEntity.FIELD_MOBILE)+"");sysUserEntity.setStatus(NumberUtils.toInt(ReflectUtils.getFieldValue(redisObj, SysUserEntity.FIELD_STATUS)+"",0));sysUserEntity.setCreateUserId(NumberUtils.toLong(ReflectUtils.getFieldValue(redisObj, SysUserEntity.FIELD_CREATEUSERID)+"",0));Object dateObj = ReflectUtils.getFieldValue(redisObj, SysUserEntity.FIELD_CREATETIME);sysUserEntity.setCreateTime(dateObj != null ? (Date) dateObj : null);return sysUserEntity;}try { user = (SysUserEntity)principals.getPrimaryPrincipal(); } catch (Exception e) { user = SysUserEntity.convertObjToEntity(principals.getPrimaryPrincipal()); }
参考文档:
https://www.cnblogs.com/wangxiaowang/p/8806335.html
http://www.voidcn.com/article/p-tcpkzgam-brs.html
http://www.zgxue.com/cask/65/652023.html
http://www.yanglajiao.com/article/m0_38043362/78064539
https://www.codetd.com/article/2547397
还没有评论,来说两句吧...