一个关于JSON的异常,获取List对象失败的。。。

重要的事情放在最前面,,以后不管遇到什么异常都一定要把异常读懂再想办法怎么解决,把异常读懂,异常读懂。。。。。。

这个异常我记得以前遇到过,而且好像已经做了笔记,,,,,今天翻了一下竟然没有,,,,,真是****

描述一下问题起源。

我想用从页面发送一个异步请求到服务器,服务器给我返回一个List对象(List<Duty>职务列表)。服务器需要把这个List对象转换成JSON格式返回。。。恩,,发送请求也没问题,已经到Controller里面的方法了,方法顺利处理,但是controller方法返回List对象的时候出现了错误。。。。。。。报了如下错误:(这个异常非常长,因为发生的是递归错误,但是重要的是前面一两句话,所以只贴最重要的。)

org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: Infinite recursion (StackOverflowError) (through reference chain: com.pms.entities.base.Duty["dutyInfos"]->org.hibernate.collection.internal.PersistentSet[0]->com.pms.entities.personnelManage.DutyInfo["duty"]->com.pms.entities.base.Duty["dutyInfos"]->org.hibernate.collection.internal.PersistentSet[0]->com.pms.entities.personnelManage.DutyInfo["duty"]->com.pms.entities.base.Duty["dutyInfos"]->org.hibernate.collection.internal.PersistentSet[0]->com.pms.entities.personnelManage.DutyInfo["duty"]->com.pms.entities.base.Duty["dutyInfos"]->org.hibernate.collection.internal.PersistentSet[0]->com.pms.entities.personnelManage.DutyInfo["duty"]->com.pms.entities.base.Duty["dutyInfos"]-后面的省略。。。。。。。。。。

解读一下这个异常:

Infinite recursion 是什么意思???---->无限递归..恩。。无限递归导致StackOverflowError。。。through reference chain

问题大概已经清楚了,,,是因为Duty持有DutyInfo的引用,而DutyInfo的又持有Duty的引用。。。所以当Controller方法返回List对象的时候,需要把列表中的对象转化为json 格式的数据,,当将一个Duty对象转为json格式的时候需要把duty对象里面的DutyInfo属性也转化,在转化DutyInfo对象的时候又因为DutyInfo中持有Duty的引用,又要将duty对象转为json,,,那么因为你引用我,我又引用你造成了无限递归。。。。。。。

那么如何解决呢???

只要双方有其中一方在转为json的时候忽略掉另一方这个引用,那么引用链就断掉了无法形成递归,比如我的Duty中有一个Set<DutyInfo>属性。我在转为json的时候忽略掉它。。。。即可解决。。因为我需要返回的数据刚好不需要Set<DutyInfo>这个属性的数据。

具体怎么做???在Duty类中的private Set<DutyInfo> dutyInfos; 上面加上@JsonIgnore这个注解即可。。。。。。。。。

这个错误已经犯两次了。。。再犯剁**

posted @ 2017-11-06 14:52  钓鱼翁  阅读(1108)  评论(0编辑  收藏  举报