俗话说新手打牌手气好,同时新手写java代码,报错也是一个接一个的~~ 作为一个进入java已经半年的小白,今天又遇到了一个奇怪的bug困扰了很久,下面就讲讲怎么解决这个bug吧!
先po一下我的报错信息:
WARN c.alibaba.com.caucho.hessian.io.SerializerFactory - Hessian/Burlap: ‘com.yzkj.zf.entity.Department’ is an unknown class in sun.misc.Launcher$AppClassLoader@18b4aac2:
虽然这个报错不影响正常的查询等操作,但是一直报错也不是长久之计,小白要有探索精神,那我们就来好好找找原因吧。
这个报错的简单理解就是:
预警了!Department这个类在AppClassLoader里找不到~
遇到这个问题后,我一下慌了,这个报错的东西我没见过,也不知道是哪里错了,所以只能问问度娘和谷歌了。
网上原理讲了很多,简单的理解就是Hessian序列化Map对象的时候出错了,
在consumer端序列化了object.map对象,在provider端解析不到object这个类,现在大致猜测问题可能出在对那个Department
的引用问题上了,所以找不到才报错。
解决流程
第一步:
我先看一下出问题的consumer端,bug是怎么写出来的呢:
-
Controller层接口代码:
-
可以看到我在构造map时,传了3个对象,第三个对象是
List<Department>
,他是一个包含着Department
类的列表。 -
这时看一下我Controller层的
Pom
文件,里面是不是引用到了Department
实体类。
-
如上图所示,我Controller的
Map
在编译的时候,是可以找到Department
这个对象的。
第二步:
- 下面看一下我的provider端是怎么接收这个map并如何处理的。
- ServiceImpl文件:
- 当打断点准备进到这个方法还没进入的时候,控制台就已经报错了。(心塞3秒)
- 这时候问题就可以锁定在这个位置了,为什么还没进方法,就报错了呢?是不是这个map在自己反序列化的时候出问题了?
- 在上面的时候我们已经提到,出现预警的根本问题是,两端找
Department
这个对象的时候找不到,那我的控制层已经引用了,会不会是这边没引用?好,我们来看一下Pom
文件。
- 果然,这边没有引用那个
system-api
,这里找不到Department
对象,那解决方法就很明显了,加上system-api
这个引用,让他能找到Department
对象就好了!(嘻嘻嘻~ 真的这么简单嘛~~)
- 噢耶! 问题真的就这样解决了!谢天谢地!!红红的预警信息不再提示了,自己又学会了一招!
这里面原理方面我说的很少,因为网上已经有很多了,我po几个参考地址,对原理执着的朋友可以看看,原创不易,希望获得你的赏赞哦~~
参考文章:
https://www.jianshu.com/p/dff4887cbeed
https://blog.csdn.net/zgyzgyzgy3338759/article/details/11022551