<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无限递归问题)的更多相关文章

  1. jackson java转json hibernate懒加载造成的无限递归问题

    @JsonIgnore @JsonFilter @JsonBackReference @JsonManagedReference @JsonIgnoreProperties jackson中的@Jso ...

  2. JPA一对多循环引用的解决&&JackSon无限递归问题

    说是解决,其实不是很完美的解决的,写出来只是想记录一下这个问题或者看一下有没有哪位仁兄会的,能否知道一二. 下面说说出现问题: 问题是这样的,当我查询一个一对多的实体的时候,工具直接就爆了,差不多我就 ...

  3. 开发问题及解决--java.lang.IllegalStateException: Circular dependencies cannot exist in RelativeLayout

    <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android=" ...

  4. java.lang.IllegalStateException: Circular dependencies cannot exist in RelativeLayout

    <TextView android:layout_width="fill_parent" android:layout_height="wrap_content&q ...

  5. hibernate无限递归问题

    项目异常如下: 2018-01-26 17:12:38.162 WARN 3128 --- [nio-8080-exec-6] .w.s.m.s.DefaultHandlerExceptionReso ...

  6. 无限递归的构造器和javap使用指南

    无限递归的构造器和javap使用指南 public class ConstructorRecursion { ConstructorRecursion rc; { rc = newConstructo ...

  7. 无限“递归”的python程序

    如果一个函数直接或者间接调用了自己,那么就形成了递归(recursion),比如斐波那契数列的一个实现 def fib(n): if n <= 2: return 1 else: return ...

  8. 【整理】iview Tree数据格式问题,无限递归树处理数据

    iview Tree数据格式问题,无限递归树处理数据 https://juejin.im/post/5b51a8a4e51d455d6825be20

  9. -java转json hibernate懒加载造成的无限递归问题

    1.在判断到底是谁维护关联关系时,可以通过查看外键,哪个实体类定义了外键,哪个类就负责维护关联关系. JoinColumn(name="pid") 2. 在保存数据时,总是先保存的 ...

随机推荐

  1. python正则表达式应用 定义一个函数,求字符串中出现的所有整数之和

  2. 如何在Data Lake Analytics中使用临时表

    前言 Data Lake Analytics (后文简称DLA)是阿里云重磅推出的一款用于大数据分析的产品,可以对存储在OSS,OTS上的数据进行查询分析.相较于传统的数据分析产品,用户无需将数据重新 ...

  3. 移动端的vh 和 vw简介和使用场景

    vw 相对于视窗的宽度:视窗宽度是100vw:vh则类似,是相对于视窗的高度,视窗高度是100vh. 这里的视窗指的又是啥? 是浏览器内部宽度大小(window.innerWidth)? 是整个浏览器 ...

  4. hackerrank--- challenges/fp-update-list

    纯属为了练习haskell, 竟然贴代码都没办法高亮. challenges/fp-update-list Update the values of a list with their absolut ...

  5. Beetl 3中文文档 转载 http://ibeetl.com/guide/

    Beetl作者:李家智(闲大赋) <xiandafu@126.com> 1. 什么是Beetl 广告:闲大赋知识星球,付费会员 Beetl( 发音同Beetle ) 目前版本是3.0.7, ...

  6. JAVA-WEB-错误之-'OPTION SQL_SELECT_LIMIT=DEFAULT'

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version ...

  7. tp5 上传视频到七牛云

    废话少说直接上代码 html <!DOCTYPE html> <html> <head> <title></title> </head ...

  8. 简单线性回归(最小二乘法)python实现

      简单线性回归(最小二乘法)¶   0.引入依赖¶ In [7]: import numpy as np import matplotlib.pyplot as plt   1.导入数据¶ In [ ...

  9. ACM:树的变换,依据表达式建立表达式树

    题目:输入一个表达式.建立一个表达式树. 分析:找到最后计算的运算符(它是整棵表达式树的根),然后递归处理!             在代码中.仅仅有当p==0的时候.才考虑这个运算符,由于括号中的运 ...

  10. Jsp中解决session过期跳转到登陆页面并跳出iframe框架的方法

    1.可以用javaScript解决在你想控制跳转的页面,比如login.jsp中的<head>与</head>之间加入以下代码: <script language=”Ja ...