web-dev-qa-db-fra.com

Différence entre @JsonIgnore et @JsonBackReference, @JsonManagedReference

Je sais que @JsonIgnore Et @JsonManagedReference, @JsonBackReference Sont utilisés pour résoudre le Infinite recursion (StackOverflowError), quelle est la différence entre ces deux?

Note: Ce sont des annotations de Jackson.

39
Kalyan Pradhan

Supposons que nous ayons

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);

La sérialisation

@JsonIgnore

private class Info {
    public int id;
    @JsonIgnore
    public Player parentPlayer;
}

et @JsonManagedReference + @JsonBackReference

private class Player {
    public int id;
    @JsonManagedReference
    public Info info;
}

private class Info {
    public int id;
    @JsonBackReference
    public Player parentPlayer;
}

produira la même sortie. Et la sortie pour le cas de démonstration ci-dessus est: {"id":1,"info":{"id":1}}

Désérialisation

Voici la principale différence, car la désérialisation avec @JsonIgnore va simplement définir null sur le champ afin que, dans notre exemple, parentPlayer soit == null.

enter image description here

Mais avec @JsonManagedReference + @JsonBackReference _ nous aurons Info referance

enter image description here

50
varren

sont utilisés pour résoudre la récursion infinie (StackOverflowError)

@JsonIgnore n'est pas conçu pour résoudre le problème de la récursion infinie , il ignore simplement que la propriété annotée n'est pas sérialisée ou désérialisée. Mais s'il y avait un lien bidirectionnel entre les champs, puisque @JsonIgnore _ ignore la propriété annotée, vous pouvez éviter la récursion infinie.

D'autre part, @JsonManagedReference et @JsonBackReference sont conçus pour gérer ce lien bidirectionnel entre les champs, l’un pour le rôle parent , l’autre pour Rôle enfant , respectivement:

Pour éviter le problème, la liaison est gérée de sorte que la propriété annotée avec @JsonManagedReference L'annotation est gérée normalement (sérialisée normalement, pas de traitement spécial pour la désérialisation) et la propriété annotée avec @JsonBackReference l'annotation n'est pas sérialisée; et lors de la désérialisation, sa valeur est définie sur une instance possédant le lien "géré" (en aval).

Pour récapituler, si vous n'avez pas besoin de ces propriétés dans le processus de sérialisation ou de désérialisation, vous pouvez utiliser @JsonIgnore. Sinon, utilisez le @JsonManagedReference/@JsonBackReference _ paire est la voie à suivre.

33
Ali Dehghani