fasterxml 循环引用导致StackOverflowError线程栈错误
来源:互联网 发布:windows.com stopcode 编辑:程序博客网 时间:2024/06/05 19:22
有时候,需要将对象json串化,转换成字符串,便于前后端数据传输,或者多平台系统交互。但一不小心,待转换成json串的对象,居然引用到系统对象,比如Spring系统对象RequestContext,然后重量级对象,数据结构是相当复杂的,各种繁杂的对象相互引用,那必然会出现递归寻找。
错误案例一:
com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: java.util.LinkedHashMap["springMacroRequestContext"]->org.springframework.web.servlet.support.RequestContext["model"]->java.util.LinkedHashMap["springMacroRequestContext"]->org.springframework.web.servlet.support.RequestContext["model"]-
……此处省略一大堆
Caused by: java.lang.StackOverflowError: null
at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_91]
at java.lang.ClassLoader.defineClass(ClassLoader.java:763) ~[na:1.8.0_91]
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[na:1.8.0_91]
错误案例二:
com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: StuClass["stus"]->java.util.ArrayList[0]->Student["stuClass"]->StuClass["stus"]->java.util.ArrayList[0]->Student["stuClass"]->StuClass["stus"]->java.util.ArrayList[0]->Student["stuClass"]->StuClass["stus"]->java.util.ArrayList[0]->Student["stuClass"]->StuClass["stus"]->java.util.ArrayList[0]->Student["stuClass"]->StuClass["stus"]->java.util.ArrayList[0]->Student["stuClass"]-
……此处省略一大堆
Caused by: java.lang.StackOverflowError: null
at java.lang.ClassLoader.defineClass1(Native Method) ~[na:1.8.0_91]
at java.lang.ClassLoader.defineClass(ClassLoader.java:763) ~[na:1.8.0_91]
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) ~[na:1.8.0_91]
来一段手动制造的循环引用,学生Student 引用 班级StuClass,班级StuClass里再引用Student。如下图:
import org.apache.commons.lang3.StringUtils;import java.util.ArrayList;import java.util.List;/** * Created by changle on 16/10/26. */@Slf4jpublic class TestCommon { private static final ObjectMapper mapper = new ObjectMapper(); @Data static class StuClass { String name; Integer pepoleNum; List<Student> stus; } @Data static class Student { String name; StuClass stuClass; } public static void main(String[] args){ Student student = new Student(); student.setName("张三"); StuClass stuClass = new StuClass(); stuClass.setName("高三(一)班"); stuClass.setPepoleNum(50); stuClass.setStus(new ArrayList<>()); stuClass.getStus().add(student); student.setStuClass(stuClass); log.info(getJsonStr(student)); } private static<T> String getJsonStr(T o){ String result = ""; try { result = mapper.writeValueAsString(o); } catch (Exception e) { log.error("getJsonStr(T o) happened error! ",e); } return result; }}
上图必抛StackOverflowError错误!
原因很清楚: 被序列化的对象引用了复杂大对象或本身出现相互引用,最终导致线程栈嵌套层次太深,抛出StackOverflowError
- fasterxml 循环引用导致StackOverflowError线程栈错误
- 死循环导致java.lang.StackOverflowError -- 栈内存溢出
- 记录一次项目引用导致的StackOverflowError
- StackOverflowError栈溢出错误
- Android布局嵌套太深导致的错误:StackOverflowError
- Android布局嵌套太深导致的错误:StackOverflowError
- 回调同名导致java.lang.StackOverflowError错误
- 循环引用导致内存泄漏
- 循环引用导致内存泄漏
- block导致的循环引用
- CCCallFuncN误用导致引用计数循环引用
- 无限递归导致StackOverflowError
- 栈溢出错误:message java.lang.StackOverflowError
- 【C#错误】未能添加对“LoginBLL”的引用,将此项目作为引用添加将导致循环依赖项
- shared_ptr:线程安全、循环引用
- shared_ptr:线程安全、循环引用
- shared_ptr:线程安全、循环引用
- shared_ptr:线程安全、循环引用
- JAVA八大排序算法之一冒泡排序
- 正则表达式匹配URL或者网址
- 斗地主代码实现分析
- FBRetainCycleDetector源码分析
- seq2seq 学习笔记
- fasterxml 循环引用导致StackOverflowError线程栈错误
- vim+xdebug+DBGp 单步调试 php
- [C++] 模板高级
- windows10iot remote client分辨率低问题
- Android面试
- jsp标签
- eclipse-tomcat部署maven项目方式之二
- 华为OJ——字符串运用-密码截取
- 当Mongo客户端在启动的时候提示由于目标计算机积极拒绝,无法连接问题解决