2024-06-08 07:44:48
最近在使用spring-boot的Cache功能时,出现了一下奇葩问题
问题现象如下图:
很滑稽的一个问题,相同的类型还出现类型转换错误
项目中的使用情况如下:
缓存配置
缓存使用
缓存使用场景
我们把上面出错的地方单独拿出来
对于这个问题,网上也有人遇到过,但是都说什么是spring-boot devtools工具的问题,感觉挺扯的,我没用这个devtools工具,但是看网上分析的大致可以得出以下结论:
当cache将数据放入缓存时,使用了默认的序列化方式(JdkSerializationRedisSerializer),该序列化使用了二进制保存了对象的上下文ClassLoader,而由于devtools导致服务重启,然后重启后ClassLoad和原来的ClassLoader不是同一个对象了,所以导致对象的Class也不一样,虽然看上去都是User,但是它就是不同的类型,因为它的Class也不相等。
这个就太扯了,我把数据放到缓存中,然后服务器重启了下,再去查缓存就不能用了,那这个缓存有啥用。
解决方案
这个问题肯定是和序列化有关的,我们指定一下缓存value的序列化方式,使用json来序列化对象,配置类的改造如下:
再重启服务,缓存读取出来反序列化后的对象,可以正常使用。
搞定!!!