Jackson-反序列化在循环依赖项上失败

好的,所以我想用杰克逊json转换器测试一些东西。我正在尝试模拟图形行为,所以这些是我的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<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

}

标签是必需的,以避免序列化时出现异常。当我尝试序列化一个对象(在文件或简单字符串上)时,一切正常。但是,当我尝试反序列化对象时,它将引发异常。这是简单的测试方法(为简单起见,省略了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);

}

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

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”属性上。由于两个不同实体的属性名称相同,因此在反序列化过程中会出现一些问题。根本不知道是否有意义,但是我解决了将JsonIdentityInfoParentEntity

的标签更改为

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

当然,我也scope=ChildEntity.class

按照此处的建议更改了ChildEntity的范围

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

以上是 Jackson-反序列化在循环依赖项上失败 的全部内容, 来源链接: utcz.com/qa/405417.html

回到顶部