目前在做springboot项目的shiro session redis共享功能。但是有一个对象我把它放到redis中之后再取出来就会出现类型不匹配的异常

AuthorizationUser user = (AuthorizationUser) cache.getSuper(key);

异常信息:

java.lang.ClassCastException: com.ch.evaluation.auth.shiro.entity.AuthorizationUser cannot be cast to com.ch.evaluation.auth.shiro.entity.AuthorizationUser

通过debug看到他们的类信息是一样的

难道只是看起来一样么?我来判断一下

结果是false ,

那么我们知道JVM判断两个类对象是否相同的依据:一是类全称;一个是类加载器

既然他俩的类全称一样,那么问题肯定就出在了类加载器上了

我们可以Debug看一下他俩的类加载器

果然不出所料,他俩的类加载器是不同的!

那么是什么原因导致他的类加载器不一样呢?

  大家都知道虚拟机的默认类加载机制是通过双亲委派实现的。springboot为了实现程序动态性(比如:代码热替换、模块热部署等,白话讲就是类文件修改后容器不重启),“破坏或牺牲” 了双亲委派模型。springboot通过强行干预-- “截获”了用户自定义类的加载(由jvm的加载器AppClassLoader变为springboot自定义的加载器RestartClassLoader,一旦发现类路径下有文件的修改,springboot中的spring-boot-devtools模块会立马丢弃原来的类文件及类加载器,重新生成新的类加载器来加载新的类文件,从而实现热部署。比较流行的OSGI也能实现热部署)。

既然源头因热部署而起,所以只要想办法关掉springboot的热部署即可。

<方案一>  通过卸掉springboot的热部署模块spring-boot-devtools来实现

在pom中注释掉springboot的spring-boot-devtools

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency>

<方案二>如果不想卸掉spring-boot-devtools模块也可禁用部署功能

读者也可以在application.properties设置禁用属性,但它的作用域只发生在当前模块,如果你的项目牵扯到多个模块,最好通过上面的方式在整个运行系统的级别禁用,以免出现多个模块之间实现类文件调用时类加载器不一致的问题。

<方案三>既然是类加载器的问题也可使用Spring的ConfigurableObjectInputStream配合Thread.currentThread().getContextClassLoader() 来使用。

转载于:https://www.cnblogs.com/UncleWang001/p/10063172.html

对象反序列化出现类型不匹配的情况(spring-boot-devtools)相关推荐

  1. 使用了Spring boot devtools, dozer转换嵌套对象失败解决记录

    2019独角兽企业重金招聘Python工程师标准>>> 业务背景: 添加商品以及价格,一个商品会有多个价格(针对不同用户等级). 代码: 先在controller中使用dozer将g ...

  2. 监控j服务器jvm运行情况 - spring boot jvisualvm

    1.准备 spring boot 1.x java 1.8 jvisualvm.exe 2.启动 java -jar xx.jar 添加参数 -Djava.rmi.server.hostname=16 ...

  3. Winform中实现序列化指定类型的对象到指定的Xml文件和从指定的Xml文件中反序列化指定类型的对象

    场景 在Winform程序中需要将某些页面的设置存储到配置文件中,下次再次打开时通过配置文件读取,点击确定时能将将设置保存到配置文件中. 之前介绍过 Winform中自定义xml配置文件后对节点进行读 ...

  4. 对象序列化流与对象反序列化流(ObjectOutputStream,ObjectInputStream)

    这个连接包含了常用的流------IO流(总篇章) 对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象 这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型.对象的数据和对象中存 ...

  5. java在何时获得对象的确切类型_JAVA面试题(1)

    基础部分 面向对象 1.谈谈你对多态的理解. 答:在java中对于多态的理解是很重要的 多态的定义: 允许不同类的对象对同一消息做出相应,同一消息可以根据发送对象的不同而采用多种不同的行为方式,(发送 ...

  6. 实现在GET请求下调用WCF服务时传递对象(复合类型)参数

    WCF实现RESETFUL架构很容易,说白了,就是使WCF能够响应HTTP请求并返回所需的资源,如果有人不知道如何实现WCF支持HTTP请求的,可参见我之前的文章<实现jquery.ajax及原 ...

  7. json 反序列化 父子类型_Jaskson精讲第7篇-类继承关系下的JSON序列化与反序列化JsonTypeInfo...

    Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的, ...

  8. c# 变量,对象,静态类型,集合类的线程安全回顾

    1.变量的线程安全性与变量的作用域有关. 2.对象 对象是类型的实例 在创建对象时,会单独有内存区域存储对象的属性和方法.所以,一个类型的多个实例,在执行时,只要没有静态变量的参与,应该都是线程安全的 ...

  9. 什么是实例对象python_python判断类型:想知道一个对象(实例或者变量)是什么类型,什么结构的...

    用type和isinstance 例子: ta={} ta['1']="a" ta={'2':"b"} ta['3']="c" #使用两个函 ...

最新文章

  1. UDP_CORK,TCP_CORK以及TCP_NODELAY
  2. python网络通信框架_Python运维-Socket网络编程 (1)
  3. 在 IntelliJ IDEA 中,如何快速将选中文件用资源管理器打开
  4. django框架 day09
  5. 饿了么前端DEMO 网址 VUE.js
  6. 【爱有失落时】风与渊
  7. C# 编译后执行bat等脚本文件 运行脚本文件 执行Copy 执行XCopy
  8. 《算法导论》第三版第4章 分治策略 练习思考题 个人答案
  9. 爱快路由,通过域名分流解决QQ网吧特权不生效的问题
  10. 自然语言处理系统NLP之拼写纠错
  11. 如何把pdf分割成多个?怎么把pdf文件分成多个?
  12. 3K水稻SNP数据集的简单利用
  13. amc 美国数学竞赛能用计算机吗,关于AMC美国数学竞赛的QA
  14. bash-記錄修改OFS和ORS讓$0重新計算
  15. Ninja ripper 工具使用教程
  16. 论文:并行化 Metropolis-Hastings 算法的一般结构
  17. 【转】这是一篇很完整的元器件选型指南
  18. JS判断客户端是Android还是iOS
  19. 基于SSH超市积分管理系统(附论文)
  20. Ubuntu Desktop 软件源

热门文章

  1. 直线的端点画垂线的lisp_【以课说法】线段、射线、直线
  2. lambda表达式创建一条最简单的线程
  3. python input 拖入路径 去除转义 空格_python学习笔记(基础-2)(转载)
  4. 关系数据库——mysql常用函数总结
  5. leetcode63 不同路径II
  6. 你担心大家会滥用的全局变量,大家(包括你自己)一定会滥用
  7. 关于NFS服务器的原理总结和mount挂载
  8. C语言深度剖析书籍学习记录 第六章 函数
  9. C语言学习:snprintf()函数
  10. 23种设计模式 -比喻