springboot换class有问题
发布网友
发布时间:2023-02-17 08:49
我来回答
共1个回答
热心网友
时间:2023-09-19 21:49
springboot环境下相同类进行转换出现ClassCastException异常
重色思倾国
回答于 2018-02-08
最近项目组出现一个很奇怪的问题,为了实现用户的单点登录,项目通过redis进行session管理。而用户的相关身份信息是以字节数组的形式存储在redis中的。既然是字节数组,自然就要进行反序列化才能还原成相关对象。而在反序列化的类型转换的时候,明明是同一个类却总是抛出ClassCastException的异常让人摸不着头脑。现将具体的解决过程总结如下。
1. 查找异常
2. 通过异常链定位源码
为了更加方便的观察问题,源码改为如下形式:
3. 问题重现,观察打印信息:
4. 根据问题查找官方文档:
https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html
5. 问题分析
1. JVM判断两个类对象是否相同的依据:一是类全称;一个是类加载器.(具体原理请自行百度,在此不再赘述)。
2. 大家都知道虚拟机的默认类加载机制是通过双亲委派实现的。springboot为了实现程序动态性(比如:代码热替换、模块热部署等,白话讲就是类文件修改后容器不重启),“破坏或牺牲” 了双亲委派模型。springboot通过强行干预-- “截获”了用户自定义类的加载(由jvm的加载器AppClassLoader变为springboot自定义的加载器RestartClassLoader,一旦发现类路径下有文件的修改,springboot中的spring-boot-devtools模块会立马丢弃原来的类文件及类加载器,重新生成新的类加载器来加载新的类文件,从而实现热部署。比较流行的OSGI也能实现热部署)。
6. 问题解决
既然源头因热部署而起,所以只要想办法关掉springboot的热部署即可。
<方案一> 通过卸掉springboot的热部署模块spring-boot-devtools来实现
在pom中注释掉springboot的spring-boot-devtools
<方案二>如果不想卸掉spring-boot-devtools模块也可禁用部署功能
springboot环境 相同类型强转回自己 ClassCastException
写spring boot 应用时发现一个奇怪的问题。 错误信息大致这样: java.lang.ClassCastException: com.tysx.monitor.User cannot be cast to com.tysx.monitor.User 类型转换,自己转自己不能转,郁闷了半天。后来 原因是 在 pom.xml 配置了热部署机制。<dependency> <groupId>...
spring-boot Cache redis 类型转换错误
对于这个问题,网上也有人遇到过,但是都说什么是spring-boot devtools工具的问题,感觉挺扯的,我没用这个devtools工具,但是看网上分析的大致可以得出以下结论: 当cache将数据放入缓存时,使用了默认的序列化方式(JdkSerializationRedisSerializer),该序列化使用了二进制保存了对象的上下文ClassLoader,而...
springboot通过变量不加载class
springboot生产环境不加载classpath:application.properties,重新指定...2018年11月16日可以在启动程序时指定读取一个文件的配置信息,这样程序就不会再加载classpath下的
springboot的xml加载不到classpath
网络的问题。多数是网络连接异常导致。1、首先打开电脑检查网络。2、其次打开springboot进行测试网络连接是否异常。3、最后点击xml重新加载classpath即可。
SpringBoot启动错误处理:Failed to determine a suitable driver cla...
解决方案 1:解决方案 2:1.添加如下依赖 2.必须要加否则启动失败 <dependency>
springboot前端网页替换无效eclipse
1、清除浏览器缓存:在浏览器中按下Ctrl+F5刷新页面,清除浏览器缓存。2、清除项目目录下的缓存文件:在SpringBoot项目的根目录下,找到名为target或者build的文件夹,删除其中的所有文件,重新启动项目,正常替换。3、确保替换的文件路径和名称一致:确保要替换的文件路径和名称与代码中的引用一致。4、检查...
springclolud 启动类添加@EnableDiscoveryClient启动报错的问题
在降低springboot版本之后我们会发现,高版本的sprinboot创建的测试类会报错 我们可以做如下修改 1、删除高版本默认导入的org.junit.jupiter.api.Test类,重新导入org.junit.Test类 2、在类上添加注释@RunWith(SpringRunner.class)3、将测试类和测试方法都修改为public ...
记录springboot遇到的一些错误
报错信息如下:报错分析:(1)主要需要注意两个错误信息:(2)引起这种报错的原因有很多,我这里出现的问题是在Thymeleaf模版页面里使用[[${user}]]获取user,因为后台没有传过来user,user是空的,所以报错,报错推荐解决方案是:禁用SerializationFeature.FAIL_ON_EMPTY_BEANS 解决方案:将报错分析中(2)...
启动spring boot报错怎么解决?
【解决办法】需要在启动类的@EnableAutoConfiguration或@SpringBootApplication中添加exclude = {DataSourceAutoConfiguration.class},排除此类的autoconfig。启动以后就可以正常运行。【原因】这个原因是maven依赖包冲突,有重复的依赖。【Spring Boot】Spring Boot是由Pivotal团队提供的全新框架,其设计目的是...
Sprtingboot启动提示错误
class})但是添加之后,依旧出现了上面的问题。原因是去除的不够彻底。所以解决方法如下:SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class,DruidDataSourceAutoConfigure.class ,HibernateJpaAutoConfiguration.class})