Подтвердить что ты не робот

Разница между @JsonIgnore и @JsonBackReference, @JsonManagedReference

Я знаю, что @JsonIgnore и @JsonManagedReference, @JsonBackReference используются для решения Infinite recursion (StackOverflowError), в чем разница между этими двумя?

Примечание: Это аннотации Джексона.

4b9b3361

Ответ 1

Предположим, что

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 там

введите описание изображения здесь

Ответ 2

используются для решения бесконечной рекурсии (StackOverflowError)

@JsonIgnore не предназначен для решения проблемы бесконечной рекурсии, он просто игнорирует аннотированное свойство из сериализации или десериализации. Но если между полями была двусторонняя связь, поскольку @JsonIgnore игнорирует аннотированное свойство, вы можете избежать бесконечной рекурсии.

С другой стороны, @JsonManagedReference и @JsonBackReference предназначены для обработки этого двух- путь между полями, один для родительской роли, другой для дочерней роли, соответственно:

Чтобы избежать проблемы, привязка обрабатывается таким образом, что свойство аннотированная аннотацией @JsonManagedReference обрабатывается обычно (сериализованные обычно, без специальной обработки для десериализации) и свойство, аннотированное аннотацией @JsonBackReference, не сериализованная; и во время десериализации его значение устанавливается на экземпляр который имеет "управляемую" (прямую) ссылку.

Чтобы повторить, если вам не нужны эти свойства в процессе сериализации или десериализации, вы можете использовать @JsonIgnore. В противном случае используется пара @JsonManagedReference/@JsonBackReference.