jackson – 反序列化失败了循环依赖

好的,所以我试图用jacksonjson转换器测试一些东西。 我正在尝试模拟图形行为,因此这些是我的POJO实体

@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 parentEntities = new ArrayList(0); private List children = new ArrayList(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 } 

标签是必需的,以避免序列化exception。 当我尝试序列化一个对象(在文件或简单的字符串上)时,一切正常。 但是,当我尝试反序列化对象时,它会抛出exception。 这是一个简单的测试方法(为简单起见省略了try / catch)

 { // create some entities, assigning them some values ParentEntity pe = new ParentEntity(); pe.setId("1"); pe.setDescription("first parent"); ChildEntity ce1 = new ChildEntity(); ce1.setId("1"); ce1.setDescription("first child"); ce1.setParent(pe); ChildEntity ce2 = new ChildEntity(); ce2.setId("2"); ce2.setDescription("second child"); ce2.setParent(pe); pe.getChildren().add(ce1); pe.getChildren().add(ce2); ParentEntity pe2 = new ParentEntity(); pe2.setId("2"); pe2.setDescription("second parent"); pe2.setParentEntity(pe); pe.getParentEntities().add(pe2); // serialization ObjectMapper mapper = new ObjectMapper(); File f = new File("parent_entity.json"); // write to file mapper.writeValue(f, pe); // write to string String s = mapper.writeValueAsString(pe); // deserialization // read from file ParentEntity pe3 = mapper.readValue(f,ParentEntity.class); // read from string ParentEntity pe4 = mapper.readValue(s, ParentEntity.class); } 

这是抛出的exception(当然,重复两次)

 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... 

那么,问题的原因是什么? 我该如何解决? 我还需要其他注释吗?

实际上,问题似乎是“id”属性。 因为两个不同实体的属性名称相同,所以在反序列化期间存在一些问题。 不知道它是否有意义,但我解决了将JsonIdentityInfo标记更改为

 @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = ParentEntity.class)) 

当然,我也使用scope=ChildEntity.class更改了ChildEntity的范围,如此处所示

顺便说一下,我愿意接受新的答案和建议。