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. 在保存数据时,总是先保存的 ...
随机推荐
- Android平台本地(离线)打包指南 - Android Studio
预备环境 AndroidStudio开发环境,要求安装Android4.0或以上(API 14)SDK. 下载HBuilder离线打包Android版SDK(5+ SDK下载). 离线打包SDK目录说 ...
- HTTP之request请求(注册)
HTTP之request请求 request:请求 作用:获取浏览器发送过来的数据 组成部分:请求行 请求头 请求体 操作请求行 格式: 请求方式 请求资源 协议/版本 常用方法:HttpServle ...
- oracle-Normal
从shutdown normal命令发布起, 禁止建立任何新的oracle连接. 数据库将等到所有用户都被断开后再继续关闭过程. 等待当前所有已连接的用户断开与数据库的连接
- 阿里云 EMAS HTTPDNS 联合函数计算重磅推出 SDNS 服务,三大能力获得突破
1. 什么是 HTTPDNS ? 传统的 DNS(Domain Name System)使开发者常面临着域名劫持.调度不精准的问题. HTTPDNS 使用 HTTP 协议替换常用的 UDP 协议,完成 ...
- Thread class vs Runnnable interface(转)
http://developer.51cto.com/art/201203/321042.htm Thread(Runnable target) Allocates a new Thread obje ...
- 支付宝sdk iOS 集成
1添加支付宝源文件和库文件AlipayOrder.h AlipayOrder.m AlipayResult.h AlipayResult.m AlixLibService.h ...
- shell学习(22)- comm
1.预备知识 comm命令可用于比较两个已排序的文件.它可以显示出第一个文件和第二个文件所独有的行以及这两个文件所共有的行.该命令有一些选项可以禁止显示指定的列,以便于执行交集和求差操作. 交集(in ...
- 【JZOJ4359】【GDKOI2016】魔卡少女
题目描述 君君是中山大学的四年级学生.有一天在家不小心开启了放置在爸爸书房中的一本古书.于是,君君把放在书中最上面的一张牌拿出来观摩了一下,突然掀起一阵大风把书中的其她所有牌吹散到各地.这时一只看上去 ...
- hdu2041 dp
#include<stdio.h> int main() { int i,t,n; ]; dp[]=; dp[]=; dp[]=; ;i<=;i++) dp[i]=dp[i-]+dp ...
- 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H Skiing【拓扑排序,关键路径】
2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 H Skiing In this winter holiday, Bob has a plan for skiing at the moun ...