Я пытаюсь десериализовать объект JSON, например
{
"name":"aaa",
"children": [
{"name":"bbb"}
]
}
, в объекты Java, в которых дочерний элемент имеет ссылку на родительский объект, например:
public class Parent {
public String name;
public List<Child> children;
}
public class Child {
public String name;
public Parent parent;
}
// ...
new ObjectMapper().readValue(<JSON>, Parent.class);
При такой десериализации Child#parent
не будет указывать на родительский объект. Я читал о двух подходах во время своего онлайн-исследования, но, похоже, они не работают.
1. Добавление аргумента конструктора в класс Child
для установки родительского объекта
public class Child {
public String name;
public Parent parent;
public Child(Parent parent) {
this.parent = parent;
}
}
При этом я получаю сообщение об ошибке:
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
Cannot construct instance of `Child` (no Creators, like default construct, exist):
cannot deserialize from Object value (no delegate- or property-based Creator)
at [Source: (String)"{"name":"aaa","children":[{"name":"bbb"}]}"; line: 1, column: 27]
(through reference chain: Parent["children"]->java.util.ArrayList[0])
2. Использование аннотаций @JsonBackReference
и @JsonManagedReference
public class Parent {
public String name;
@JsonBackReference
public List<Child> children;
}
public class Child {
public String name;
@JsonManagedReference
public Parent parent;
}
Это не работает с:
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
Cannot handle managed/back reference 'defaultReference':
back reference type (java.util.List) not compatible with managed type (Child)
at [Source: (String)"{"name":"aaa","children":[{"name":"bbb"}]}"; line: 1, column: 1]
JavaDo c из @JsonBackReference
говорит, что его нельзя применить к коллекций, поэтому он, очевидно, не работает, но мне интересно, почему в Интернете так много примеров, где он применяется к коллекции.
Вопрос Как я могу добиться, чтобы дочерний объект получил своего родителя / владелец объекта автоматически устанавливается при десериализации графа объекта. На самом деле я бы предпочел каким-то образом заставить работать первый подход, так как он не загрязняет, требуется загрязнять классы аннотациями c фреймворка.