Jackson-sérialisation des entités avec des relations birectionnelles (éviter les cycles)

j'ai deux entités:

Parent {
   Child[] children;
}

and 

Child {
   Parent parent;
}

je suis au courant pour @JsonBackReference et @JsonManagedReference . Ils sont bons, si je sérialise des instances de Parent .

mais je dois aussi transférer les instances de Child et je veux que le champ parent soit peuplé.

en d'autres termes:

  1. sur la sérialisation de Parent il devrait avoir children mais leur parent le champ peut être vide (peut être résolu en utilisant json annotations de référence).
  2. Sur la sérialisation de Child , il faut avoir parent avec leur children (mais children ne pas avoir parent peuplée.

Existe-t-il un moyen de le résoudre en utilisant les capacités Jackson standard?

i. e. sauter la sérialisation des entités qui ont déjà été sérialisées au lieu de marquer les champs éligibles ou non admissible à la sérialisation.

39
demandé sur Eugene Retunsky 2012-04-08 21:54:38

2 réponses

Jackson 2.0 Supporte les références complètes d'objets cycliques. Voir " Jackson 2.0 publié "(section " Gérer n'Importe quel Objet de Graphiques, de même Cyclique!') pour un exemple.

fondamentalement, vous aurez besoin d'utiliser le nouveau @JsonIdentityInfo pour les types qui exigent la manipulation de style id/idref. Dans votre cas, ce serait à la fois Parent et Child types (si l'un étend l'autre, il suffit de l'ajouter au super type et c'est très bien).

36
répondu StaxMan 2012-04-09 17:21:24

mise en œuvre d'interface très pratique est fourni dans la bibliothèque jackson 2 comme

@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Parent { ....

@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Child { ....

maven

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.0.2</version>
</dependency>

@StaxMan a fourni un lien agréable pour commencer à partir de

18
répondu Oleksii Kyslytsyn 2015-03-07 01:21:02