Я знаю, что @JsonIgnore
и @JsonManagedReference
, @JsonBackReference
используются для решения Infinite recursion (StackOverflowError)
, в чем разница между этими двумя?
Примечание: Это аннотации Джексона.
Я знаю, что @JsonIgnore
и @JsonManagedReference
, @JsonBackReference
используются для решения Infinite recursion (StackOverflowError)
, в чем разница между этими двумя?
Примечание: Это аннотации Джексона.
Предположим, что
private class Player {
public int id;
public Info info;
}
private class Info {
public int id;
public Player parentPlayer;
}
// something like this:
Player player = new Player(1);
player.info = new Info(1, player);
@JsonIgnore
private class Info {
public int id;
@JsonIgnore
public Player parentPlayer;
}
и @JsonManagedReference
+ @JsonBackReference
private class Player {
public int id;
@JsonManagedReference
public Info info;
}
private class Info {
public int id;
@JsonBackReference
public Player parentPlayer;
}
будет выдавать тот же результат. И вывод для демонстрационного примера сверху: {"id":1,"info":{"id":1}}
Здесь основное отличие, поскольку десериализация с @JsonIgnore
просто установит значение null в поле, поэтому в нашем примере parentPlayer будет == null.
Но с @JsonManagedReference
+ @JsonBackReference
мы получим ссылку Info
там
используются для решения бесконечной рекурсии (StackOverflowError)
@JsonIgnore
не предназначен для решения проблемы бесконечной рекурсии, он просто игнорирует аннотированное свойство из сериализации или десериализации. Но если между полями была двусторонняя связь, поскольку @JsonIgnore
игнорирует аннотированное свойство, вы можете избежать бесконечной рекурсии.
С другой стороны, @JsonManagedReference
и @JsonBackReference
предназначены для обработки этого двух- путь между полями, один для родительской роли, другой для дочерней роли, соответственно:
Чтобы избежать проблемы, привязка обрабатывается таким образом, что свойство аннотированная аннотацией
@JsonManagedReference
обрабатывается обычно (сериализованные обычно, без специальной обработки для десериализации) и свойство, аннотированное аннотацией@JsonBackReference
, не сериализованная; и во время десериализации его значение устанавливается на экземпляр который имеет "управляемую" (прямую) ссылку.
Чтобы повторить, если вам не нужны эти свойства в процессе сериализации или десериализации, вы можете использовать @JsonIgnore
. В противном случае используется пара @JsonManagedReference
/@JsonBackReference
.