对象反序列化出现类型不匹配的情况(spring-boot-devtools)
目前在做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)相关推荐
- 使用了Spring boot devtools, dozer转换嵌套对象失败解决记录
2019独角兽企业重金招聘Python工程师标准>>> 业务背景: 添加商品以及价格,一个商品会有多个价格(针对不同用户等级). 代码: 先在controller中使用dozer将g ...
- 监控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 ...
- Winform中实现序列化指定类型的对象到指定的Xml文件和从指定的Xml文件中反序列化指定类型的对象
场景 在Winform程序中需要将某些页面的设置存储到配置文件中,下次再次打开时通过配置文件读取,点击确定时能将将设置保存到配置文件中. 之前介绍过 Winform中自定义xml配置文件后对节点进行读 ...
- 对象序列化流与对象反序列化流(ObjectOutputStream,ObjectInputStream)
这个连接包含了常用的流------IO流(总篇章) 对象序列化:就是将对象保存到磁盘中,或者在网络中传输对象 这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型.对象的数据和对象中存 ...
- java在何时获得对象的确切类型_JAVA面试题(1)
基础部分 面向对象 1.谈谈你对多态的理解. 答:在java中对于多态的理解是很重要的 多态的定义: 允许不同类的对象对同一消息做出相应,同一消息可以根据发送对象的不同而采用多种不同的行为方式,(发送 ...
- 实现在GET请求下调用WCF服务时传递对象(复合类型)参数
WCF实现RESETFUL架构很容易,说白了,就是使WCF能够响应HTTP请求并返回所需的资源,如果有人不知道如何实现WCF支持HTTP请求的,可参见我之前的文章<实现jquery.ajax及原 ...
- json 反序列化 父子类型_Jaskson精讲第7篇-类继承关系下的JSON序列化与反序列化JsonTypeInfo...
Jackson是Spring Boot(SpringBoot)默认的JSON数据处理框架,但是其并不依赖于任何的Spring 库.有的小伙伴以为Jackson只能在Spring框架内使用,其实不是的, ...
- c# 变量,对象,静态类型,集合类的线程安全回顾
1.变量的线程安全性与变量的作用域有关. 2.对象 对象是类型的实例 在创建对象时,会单独有内存区域存储对象的属性和方法.所以,一个类型的多个实例,在执行时,只要没有静态变量的参与,应该都是线程安全的 ...
- 什么是实例对象python_python判断类型:想知道一个对象(实例或者变量)是什么类型,什么结构的...
用type和isinstance 例子: ta={} ta['1']="a" ta={'2':"b"} ta['3']="c" #使用两个函 ...
最新文章
- UDP_CORK,TCP_CORK以及TCP_NODELAY
- python网络通信框架_Python运维-Socket网络编程 (1)
- 在 IntelliJ IDEA 中,如何快速将选中文件用资源管理器打开
- django框架 day09
- 饿了么前端DEMO 网址 VUE.js
- 【爱有失落时】风与渊
- C# 编译后执行bat等脚本文件 运行脚本文件 执行Copy 执行XCopy
- 《算法导论》第三版第4章 分治策略 练习思考题 个人答案
- 爱快路由,通过域名分流解决QQ网吧特权不生效的问题
- 自然语言处理系统NLP之拼写纠错
- 如何把pdf分割成多个?怎么把pdf文件分成多个?
- 3K水稻SNP数据集的简单利用
- amc 美国数学竞赛能用计算机吗,关于AMC美国数学竞赛的QA
- bash-記錄修改OFS和ORS讓$0重新計算
- Ninja ripper 工具使用教程
- 论文:并行化 Metropolis-Hastings 算法的一般结构
- 【转】这是一篇很完整的元器件选型指南
- JS判断客户端是Android还是iOS
- 基于SSH超市积分管理系统(附论文)
- Ubuntu Desktop 软件源