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.
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);
@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}}
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.
Mais avec @JsonManagedReference
+ @JsonBackReference
_ nous aurons Info
referance
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.