之前在开发过程中遇到的一些坑因为比较忙所以一直没时间把它们记录下来,今天恰好有比较多的空闲时间,所以尽快来总结下吧!
不知道大家在开发过程中序列化对象到前端时是否会碰到Could not write JSON: Infinite recursion (StackOverflowError)这样的报错,本人在之前跟前端联调时就遇到了这种情况。也就是如下图的报错:
遇到问题我们首先得分析出其中的原因,然后再寻求解决方案。那么是什么导致了这种报错呢?首先我们可以从字面上理解这个报错,Could not write JSON: Infinite recursion (StackOverflowError) 从字面上可以看出,无法写JSON,也就是序列化对象成json时报错了,报错的原因是无限递归所导致的。那么好端端的为什么凭空的就出现这种报错呢?百思不得其解的我google了一下发现,当我们序列化entities with bidirectional relationships(具有双向关系的实体)时,如果不采取相关的对应策略,就会出现这种情况。举个栗子吧,如果有如下这样的两个实体:
相信细心的同学可以发现User实体里面包含了Item实体,而Item实体里面也包含了User实体,所以当我们尝试去序列化时就会出现如下的报错:
从报错信息中可以看出,我们可以发现这样的问题Item->User->Item->User…,如果不做处理,程序就会不加控制地无线递归下去,这也就导致了序列化出错了!那么如何解决呢?大家可以参考下这个网址,我觉得里面讲得已经够详细了。Jackson – Bidirectional Relationships
接下里我就说下我在实际项目中是如何解决的?项目中当我尝试调试了下,于是遇到了这种情况,大家可以看如下的图:
从上图可以看出这个parent这个对象存在着无线递归的嫌疑,就是我不断打开parant对象时它下面还有parent,也就是无止境的!于是我就单独把全部对象序列化后打印了出来,如下图所示:
从上图可以看出rules这个数组里面是包括parent这个对象的。同时parent对象里面有个$ref这个字段,里面居然还包括了rules数组、lhs和criterion对象。从这里可以看出,这两个实体之间是具有双向关系的!那后来我是如何解决的呢?因为这个parent对象也是后来调试时才发现的,它在实际项目中并无实在的意义,于是我索性把它给删除了,如下图所示:
将每个对象中的parent字段删除了之后,我再进行了序列化操作,这次可以了!搞定!!!‘
其实遇到问题时,先不要着急地去马上解决问题,可以像我一样,先去分析产生这个问题的原因,然后再去寻求办法解决!这样不但让你成功解决了问题,而且知道为什么会产生这个问题,下次你就不会轻易犯这个错误啦!
春节将至,这里提前祝大家春节快乐!
来源:CSDN
作者:Melo_FengZhi
链接:https://blog.csdn.net/Melo_FengZhi/article/details/104036878