Джексон - десериализация терпит неудачу на круговых зависимостях

Итак, я пытаюсь проверить некоторые вещи с помощью JSON JSON Converter. Я пытаюсь смоделировать поведение графа, так что это мои объекты 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
}

Теги необходимы для того, чтобы избежать исключения при сериализации. Когда я пытаюсь сериализовать объект (как в файле, так и в простой строке), все работает нормально. Однако, когда я пытаюсь десериализовать объект, он выдает исключение. Это простой метод тестирования (попробуйте / поймать опущен для простоты)

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

Итак, в чем причина проблемы? Как я могу это исправить? Нужна ли какая-то другая аннотация?

1 ответ

Решение

На самом деле, похоже, что проблема была в свойстве id. Поскольку имя свойства одинаково для двух разных объектов, при десериализации возникли некоторые проблемы. Не знаю, имеет ли это смысл, но я решил проблему, изменив JsonIdentityInfo тег ParentEntity для

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

Конечно, я также изменил область действия ChildEntity с scope=ChildEntity.classкак предложено здесь

Кстати, я открыт для новых ответов и предложений.

Другие вопросы по тегам