当前位置: 首页 > 面试题库 >

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

尉迟鸿熙
2023-03-14
问题内容

好的,所以我想用杰克逊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的范围

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



 类似资料:
  • 问题内容: 好的,所以我想用杰克逊json转换器测试一些东西。我正在尝试模拟图形行为,所以这些是我的POJO实体 标签是必需的,以避免序列化时出现异常。当我尝试序列化一个对象(在文件或简单字符串上)时,一切正常。但是,当我尝试反序列化对象时,它将引发异常。这是简单的测试方法(为简单起见,省略了try / catch) 这是抛出的异常(当然,重复两次) 那么,问题的原因是什么呢?我该如何解决?我还需

  • 我想反序列化表单中的类: 其中文本是加密的,反序列化应该在重建TestFieldEncryptedMessage实例之前取消对值的加密。 我采用的方法非常类似于:https://github.com/codesqueak/jackson-json-crypto 也就是说,我正在构建一个扩展SimpleModule的模块: 如您所见,设置了两个修饰符:EncryptedSerializerModif

  • 我试图使用一个服务,它给我一个实体,它的字段是一个数组。 但是,当数组包含单个项时,将返回项本身,而不是返回一个元素的数组。 在这种情况下,Jackson无法转换为我的Java对象。 有一个简单的解决方案吗?

  • 我试图用jackson序列化一些数据,这在大多数情况下都很好,但现在我对列表有问题。该列表的类型为 A,它是一个抽象类,可能包含循环依赖项。我不知道如何使用 jackson 序列化这个结构。IdentityInformation和typeInformation的组合似乎无法正常工作。下面是示例代码,它产生了我面临的问题。 我使用的是 Jackson 版本 2.8.3。我错过了什么吗?有没有一个好的

  • 希, 我所拥有的: 公开课myPojo 我想要的是,如果Map中的一个字段不满足POJO,则使从Map到POJO的转换失败(抛出异常)。 它似乎不能使用DeserializationFeature进行任何类型的配置。我试图调整所有与空字段有关的配置

  • 我在试着读我的。json文件。Is是一个车辆存储类。 这是错误: com.fasterxml.jackson.databind.exc.MismatchedInputException:无法构造的实例(尽管至少存在一个Creator):无法构造的实例(尽管至少存在一个Creator):没有字符串参数构造函数/工厂方法来从[Source:(File); line: 1,列: 1]处的字符串值反序列化