Jackson-deserialization fails on circular dependencies(JackSon无限递归问题)
<div class="row">
<div class="col">
Ok, so I'm trying to test some stuffs with jackson json converter.
I'm trying to simulate a graph behaviour, so these are my POJO entities
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class ParentEntity implements java.io.Serializable
{
private String id;
private String description;
private ParentEntity parentEntity;
private List<ParentEntity> parentEntities = new ArrayList<ParentEntity>(0);
private List<ChildEntity> children = new ArrayList<ChildEntity>(0);
// ... getters and setters
}
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class ChildEntity implements java.io.Serializable
{
private String id;
private String description;
private ParentEntity parent;
// ... getters and setters
}
The tags are required in order to avoid exception on serialization.
When I try to serialize an object (both on a file or on a simple string) all works fine. However, when I try to deserialize the object, it throws an exception. This is the simple test method (try/catch omitted for simplicity)
{
// create some entities, assigning them some values
ParentEntity pe = new ParentEntity();
pe.setId("1");
pe.setDescription("first parent");
</span><span class="typ">ChildEntity</span><span class="pln"> ce1 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd"><span class="hljs-keyword">new</span></span><span class="pln"> </span><span class="typ">ChildEntity</span><span class="pun">();</span><span class="pln">
ce1</span><span class="pun">.</span><span class="pln">setId</span><span class="pun">(</span><span class="str"><span class="hljs-string">"1"</span></span><span class="pun">);</span><span class="pln">
ce1</span><span class="pun">.</span><span class="pln">setDescription</span><span class="pun">(</span><span class="str"><span class="hljs-string">"first child"</span></span><span class="pun">);</span><span class="pln">
ce1</span><span class="pun">.</span><span class="pln">setParent</span><span class="pun">(</span><span class="pln">pe</span><span class="pun">);</span><span class="pln">
</span><span class="typ">ChildEntity</span><span class="pln"> ce2 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd"><span class="hljs-keyword">new</span></span><span class="pln"> </span><span class="typ">ChildEntity</span><span class="pun">();</span><span class="pln">
ce2</span><span class="pun">.</span><span class="pln">setId</span><span class="pun">(</span><span class="str"><span class="hljs-string">"2"</span></span><span class="pun">);</span><span class="pln">
ce2</span><span class="pun">.</span><span class="pln">setDescription</span><span class="pun">(</span><span class="str"><span class="hljs-string">"second child"</span></span><span class="pun">);</span><span class="pln">
ce2</span><span class="pun">.</span><span class="pln">setParent</span><span class="pun">(</span><span class="pln">pe</span><span class="pun">);</span><span class="pln">
pe</span><span class="pun">.</span><span class="pln">getChildren</span><span class="pun">().</span><span class="pln">add</span><span class="pun">(</span><span class="pln">ce1</span><span class="pun">);</span><span class="pln">
pe</span><span class="pun">.</span><span class="pln">getChildren</span><span class="pun">().</span><span class="pln">add</span><span class="pun">(</span><span class="pln">ce2</span><span class="pun">);</span><span class="pln">
</span><span class="typ">ParentEntity</span><span class="pln"> pe2 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd"><span class="hljs-keyword">new</span></span><span class="pln"> </span><span class="typ">ParentEntity</span><span class="pun">();</span><span class="pln">
pe2</span><span class="pun">.</span><span class="pln">setId</span><span class="pun">(</span><span class="str"><span class="hljs-string">"2"</span></span><span class="pun">);</span><span class="pln">
pe2</span><span class="pun">.</span><span class="pln">setDescription</span><span class="pun">(</span><span class="str"><span class="hljs-string">"second parent"</span></span><span class="pun">);</span><span class="pln">
pe2</span><span class="pun">.</span><span class="pln">setParentEntity</span><span class="pun">(</span><span class="pln">pe</span><span class="pun">);</span><span class="pln">
pe</span><span class="pun">.</span><span class="pln">getParentEntities</span><span class="pun">().</span><span class="pln">add</span><span class="pun">(</span><span class="pln">pe2</span><span class="pun">);</span><span class="pln">
</span><span class="com"><span class="hljs-comment">// serialization</span></span><span class="pln">
</span><span class="typ">ObjectMapper</span><span class="pln"> mapper </span><span class="pun">=</span><span class="pln"> </span><span class="kwd"><span class="hljs-keyword">new</span></span><span class="pln"> </span><span class="typ">ObjectMapper</span><span class="pun">();</span><span class="pln">
</span><span class="typ">File</span><span class="pln"> f </span><span class="pun">=</span><span class="pln"> </span><span class="kwd"><span class="hljs-keyword">new</span></span><span class="pln"> </span><span class="typ">File</span><span class="pun">(</span><span class="str"><span class="hljs-string">"parent_entity.json"</span></span><span class="pun">);</span><span class="pln">
</span><span class="com"><span class="hljs-comment">// write to file</span></span><span class="pln">
mapper</span><span class="pun">.</span><span class="pln">writeValue</span><span class="pun">(</span><span class="pln">f</span><span class="pun">,</span><span class="pln"> pe</span><span class="pun">);</span><span class="pln">
</span><span class="com"><span class="hljs-comment">// write to string</span></span><span class="pln">
</span><span class="typ">String</span><span class="pln"> s </span><span class="pun">=</span><span class="pln"> mapper</span><span class="pun">.</span><span class="pln">writeValueAsString</span><span class="pun">(</span><span class="pln">pe</span><span class="pun">);</span><span class="pln">
</span><span class="com"><span class="hljs-comment">// deserialization</span></span><span class="pln">
</span><span class="com"><span class="hljs-comment">// read from file</span></span><span class="pln">
</span><span class="typ">ParentEntity</span><span class="pln"> pe3 </span><span class="pun">=</span><span class="pln"> mapper</span><span class="pun">.</span><span class="pln">readValue</span><span class="pun">(</span><span class="pln">f</span><span class="pun">,</span><span class="typ">ParentEntity</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span><span class="pln">
</span><span class="com"><span class="hljs-comment">// read from string</span></span><span class="pln">
</span><span class="typ">ParentEntity</span><span class="pln"> pe4 </span><span class="pun">=</span><span class="pln"> mapper</span><span class="pun">.</span><span class="pln">readValue</span><span class="pun">(</span><span class="pln">s</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ParentEntity</span><span class="pun">.</span><span class="kwd">class</span><span class="pun">);</span><span class="pln">
}
and this is the exception thrown (of course, repeated twice)
com.fasterxml.jackson.databind.JsonMappingException: Already had POJO for id (java.lang.String) [com.fasterxml.jackson.annotation.ObjectIdGenerator$IdKey@3372bb3f] (through reference chain: ParentEntity["children"]->java.util.ArrayList[0]->ChildEntity["id"])
...stacktrace...
Caused by: java.lang.IllegalStateException: Already had POJO for id (java.lang.String) [com.fasterxml.jackson.annotation.ObjectIdGenerator$IdKey@3372bb3f]
...stacktrace...
So, what is the cause of the problem? How can I fix it? Do I need some other annotation?
Jackson-deserialization fails on circular dependencies(JackSon无限递归问题)的更多相关文章
- jackson java转json hibernate懒加载造成的无限递归问题
@JsonIgnore @JsonFilter @JsonBackReference @JsonManagedReference @JsonIgnoreProperties jackson中的@Jso ...
- JPA一对多循环引用的解决&&JackSon无限递归问题
说是解决,其实不是很完美的解决的,写出来只是想记录一下这个问题或者看一下有没有哪位仁兄会的,能否知道一二. 下面说说出现问题: 问题是这样的,当我查询一个一对多的实体的时候,工具直接就爆了,差不多我就 ...
- 开发问题及解决--java.lang.IllegalStateException: Circular dependencies cannot exist in RelativeLayout
<?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android=" ...
- java.lang.IllegalStateException: Circular dependencies cannot exist in RelativeLayout
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content&q ...
- hibernate无限递归问题
项目异常如下: 2018-01-26 17:12:38.162 WARN 3128 --- [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionReso ...
- 无限递归的构造器和javap使用指南
无限递归的构造器和javap使用指南 public class ConstructorRecursion { ConstructorRecursion rc; { rc = newConstructo ...
- 无限“递归”的python程序
如果一个函数直接或者间接调用了自己,那么就形成了递归(recursion),比如斐波那契数列的一个实现 def fib(n): if n <= 2: return 1 else: return ...
- 【整理】iview Tree数据格式问题,无限递归树处理数据
iview Tree数据格式问题,无限递归树处理数据 https://juejin.im/post/5b51a8a4e51d455d6825be20
- -java转json hibernate懒加载造成的无限递归问题
1.在判断到底是谁维护关联关系时,可以通过查看外键,哪个实体类定义了外键,哪个类就负责维护关联关系. JoinColumn(name="pid") 2. 在保存数据时,总是先保存的 ...
随机推荐
- YouTube上最受欢迎的十大机器学习视频(最新)
2017-05-04 机器之心 选自KDnuggets 作者:Thuy T. Pham 机器之心编译 参与:微胖.黄小天 虽然 YouTube 有很多不错的机器学习视频,但是很难搞清楚是否值得一看,何 ...
- 洛谷 P2955 [USACO09OCT]奇数偶数Even? Odd?【字符串/易错】
题目描述 Bessie's cruel second grade teacher has assigned a list of N (1 <= N <= 100) positive int ...
- Swift 之数组与字典
http://www.cocoachina.com/swift/20151230/14802.html 说到数组和字典,只要是编过程的小伙伴并不陌生.在Swift中的数组与字典也有着一些让人眼前一亮的 ...
- JSP Web第六章整理复习 JavaBean技术
P183 什么是JavaBean,JavaBean有哪些特点? javabean是一种特殊的java类 特点:属性private,方法public P184 JavaBean封装数据,例6-1,6-2 ...
- Codeforces 13C
这题纠结了近半年,一直没有好的思路. 刚开始看这题的时候就是暴力,明显的TLE 后来才知道这题的“一种解”肯定是"原数列中某些数的集合" (很明显这题的最优策略并不唯一) 有原数列 ...
- 【JZOJ3854】【NOIP2014八校联考第2场第2试9.28】分组(group)
MEi Bsny所在的精灵社区有n个居民,每个居民有一定的地位和年龄,ri表示第i个人的地位,ai表示第i个人的年龄. 最近社区里要举行活动,要求几个人分成一个小组,小组中必须要有一个队长,要成为队长 ...
- 洛谷 P1342 请柬 最短路+Dijkstra算法
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1342 请柬 题目描述 在电视时代,没有多少人观看戏 ...
- ipad模拟器iPadian.exe
http://dl.pconline.com.cn/download/368140.html 苹果IPAD模拟器!让你的电脑立刻拥有IOS系统!马上变成ipad!几百个免费的扩展应用程序,能登QQ,微 ...
- python socketserver ftp上传功能
一.socketserver用于多个客户端访问同一个服务端 客户端 import socket client = socket.socket() ip_port = ('127.0.0.1',8001 ...
- postman认证使用篇(五)
postman 认证使用篇(五) Authorization 尽管请求编辑器已经足够强大去构造各种各样的请求,但是有的时候你的请求可能是需要认证,那么就可以尝试使用下面的认证功能了(由于认证的参数信息 ...