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.

29
demandé sur Kalyan Pradhan 2016-05-23 16:45:58

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.

enter image description here

Mais @JsonManagedReference+ @JsonBackReference nous aurons Info referance il

enter image description here

34
répondu varren 2017-06-15 05:54:40

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.

25
répondu Ali Dehghani 2016-05-23 14:35:58