博客项目踩坑-Could not write JSON: Infinite recursion (StackOverflowError)

之前用SpringBoot+JPA+Thymeleaf的方式开发过一个博客系统,现在想要将博客系统改造成前后端分离的方式(前端Vue,后端SpringBoot),开发过程中遇到Could not write JSON: Infinite recursion (StackOverflowError)的问题。
控制台报错如下:
在这里插入图片描述
于是检查Network控制台,发现从后端获取到的数据过大,博客系统真正的数据传输量应该远小于这些值
在这里插入图片描述
控制台报错信息如下(部分):

org.springframework.http.converter.HttpMessageNotWritableException: 
Could not write JSON: Infinite recursion (StackOverflowError); 
nested exception is com.fasterxml.jackson.databind.JsonMappingException: 
Infinite recursion (StackOverflowError) (through reference chain: 
com.example.blog2.po.Blog["type"]->
com.example.blog2.po.Type["blogs"]->
org.hibernate.collection.internal.PersistentBag[0]->
com.example.blog2.po.Blog["type"]->
com.example.blog2.po.Type["blogs"]->
org.hibernate.collection.internal.PersistentBag[0]

于是便想到了是不是系统返回数据的过程中出现了死循环的问题,通过分析控制台的报错信息,不难看出,是因为type和blogs之间出现了循环引用才导致的死循环。
在Blog类中,通过以下方式引用了Type类

@ManyToOne
private Type type;

而在Type类中则引用着一个博客列表

@OneToMany(mappedBy = "type")
private List<Blog> blogs = new ArrayList<>();

这样的引用方式可以方便地实现数据库中一对多关系的映射,将t_type的id属性作为外键写入t_blog中,但在将数据传给前端时,需要将数据进行Json序列化,由于相互引用的原因,序列化Blog时也会序列化Type类,但因为Type类中有blog列表的引用,便会将blog列表也序列化,这样就会发生死循环的问题。
经上网百度,要解决这个问题,有如下几种思路

  1. BlogType属性的get方法上加上@JsonBackReference注解,表示序列化时忽略type属性。
  2. 重新修改代码,避免循环引用。
  3. BlogType属性的get方法上加上@JsonIgnoreProperties({ "blogs"})注解,传blog对象时,忽略Type中的Blogs列表属性。

由于前端需要的得到blog关联的type属性,而采用第一种方式则无法得到type属性的信息,因此第一种方式不可行,而重新修改代码又会使JPA的功能达不到充分的利用,因此选用第二种方式也不合理。
在第三种方式中,忽略博客Type属性中的Blog列表属性,从而切断了循环引用,同时也保留了必要的信息,是目前解决StackOverflowError问题的最优解。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值