web-dev-qa-db-fra.com

Jackson - sérialisation d'entités avec des relations bidirectionnelles (évitant les cycles)

J'ai deux entités:

Parent {
   Child[] children;
}

and 

Child {
   Parent parent;
}

Je connais @JsonBackReference et @JsonManagedReference. Ils sont bons, si je sérialise des instances de Parent.

Mais je dois également transférer des instances de Child et je veux que le champ parent soit rempli.

En d'autres termes:

  1. Lors de la sérialisation de Parent, il devrait avoir children mais leur champ parent peut être vide (peut être résolu en utilisant des annotations de référence json).
  2. Lors de la sérialisation de Child, il devrait avoir parent avec leur children (mais children n'a pas besoin d'avoir parent rempli.

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

C'est à dire. ignorer la sérialisation des entités qui étaient déjà sérialisées au lieu de marquer les champs éligibles ou non éligibles pour la sérialisation.

43
Eugene Retunsky

Jackson 2.0 prend en charge les références d'objet cycliques complètes. Voir " Jackson 2.0 est sorti " (section 'Gérer tous les graphiques d'objets, même cycliques!') Pour un exemple.

Fondamentalement, vous devrez utiliser le nouveau @JsonIdentityInfo pour les types qui nécessitent une gestion de style id/idref. Dans votre cas, ce serait à la fois les types Parent et Child (si l'un étend l'autre, ajoutez-le simplement au super type et c'est très bien).

40
StaxMan

l'implémentation de l'interface très pratique est fournie 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 joli lien pour commencer

21