Différence entre @JsonIgnore et @Jsonbackref, @Jsonmanagedref
je sais que les deux @JsonIgnore
et @JsonManagedReference
,@JsonBackReference
sont utilisées pour résoudre le Infinite recursion (StackOverflowError)
, quelle est la différence entre ces deux?
Remarque : Ce sont des annotations Jackson.
2 réponses
supposons que nous avons
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 sortie pour la démo de cas à partir de ci-dessus est: {"id":1,"info":{"id":1}}
Désérialisation
Voici la différence principale, parce que la désérialisation avec @JsonIgnore
dans notre exemple, parentPlayer sera == NULL.
Mais @JsonManagedReference
+ @JsonBackReference
nous aurons Info
referance il
sont utilisés pour résoudre la récursion infinie (StackOverflowError)
@JsonIgnore
n'est pas conçu pour résoudre le Récursion Infinie problème, il ignore juste les annoté de la propriété d'être sérialisés ou désérialisé. 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, un pour Parent rôle, l'autre pour Enfant rôle, respectivement:
Pour éviter le problème, le couplage est gérée tels que la propriété annoté avec
@JsonManagedReference
l'annotation est traitée normalement (sérialisé normalement, pas de traitement particulier pour la désérialisation) et la propriété annotée de@JsonBackReference
l'annotation n'est pas sérialisé; et au cours de deserialization, sa valeur est définie à instance qui a "réussi" (en avant).
pour récapituler, si vous n'avez pas besoin de ces propriétés dans le processus de sérialisation ou de desérialisation, vous pouvez utiliser @JsonIgnore
. Sinon, l'utilisation de l' @JsonManagedReference
/@JsonBackReference
la paire est le chemin à parcourir.