解决问题--java.lang.ClassNotFoundException -- redis抛出

首先看报错日志:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.redis.serializer.SerializationException: Cannot deserialize; nested exception is org.springframework.core.serializer.support.SerializationFailedException: Failed to deserialize payload. Is the byte array a result of corresponding serialization for DefaultDeserializer?; nested exception is org.springframework.core.NestedIOException: Failed to deserialize object type; nested exception is java.lang.ClassNotFoundException: com.example.back.entity.InfoType] with root cause

java.lang.ClassNotFoundException: com.example.back.entity.InfoType
	at java.net.URLClassLoader.findClass(URLClassLoader.java:382) ~[na:1.8.0_201]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[na:1.8.0_201]
	at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:93) ~[back-1.0.0.jar:1.0.0-SNAPSHOT]
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[na:1.8.0_201]
	at java.lang.Class.forName0(Native Method) ~[na:1.8.0_201]
	at java.lang.Class.forName(Class.java:348) ~[na:1.8.0_201]
	...

今天看了下项目代码,最近一次修改是将部分命名不规范的包名进行的规范化,例如将back(后端)修改为了mp(小程序),并将所有相关地方的对应包名进行了修改,在本地测试发现没毛病。部署到正式机之后报了上述错误,注意仔细查看日志 仔细查看日志 仔细查看日志,最后发现报错中描述与redis相关:org.springframework.data.redis.serializer.SerializationException:
出错原因:

  1. 之前存储redis缓存过程存储的对象类型是com.example.back.entity.InfoType,并且缓存是有效没有过期的;
  2. 重命名包名后的jar包内是没有这个类的。

这样试演一下,当重新发起请求获取相关数据的时候,是从redis缓存取的,取出后redis库会对结果进行序列化对象映射,这是发现没有需要的那个类,就抛出了异常。

解决:

  1. 删除与旧包名相关的所有redis缓存;
  2. 删除所有的key:flushall

从以上问题学习到:
1.不要轻易修改应用包名,牵涉的地方较多;
2.如必须修改应考虑到相关的所有地方,redis MongoDB等等的存储;
3.仔细查看报错日志,最好列出异常抛出的层次结构,以本篇异常为例层次结构为:

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception
org.springframework.data.redis.serializer.SerializationException: Cannot deserialize;
org.springframework.core.serializer.support.SerializationFailedException:
org.springframework.core.NestedIOException: Failed to deserialize object type; 
java.lang.ClassNotFoundException: com.example.back.entity.InfoType]

从上层看是redis的反序列化失败(Cannot deserialize)抛出的异常,看到这里就可得出出错的原因,然后往底层看,看到在反序列化com.example.back.entity.InfoType的过程出错的。这样也就能明确问题所在了:即旧的缓存无法反序列化到新的实体类上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值