Jackson-serialización de entidades con relaciones bidireccionales (evitando ciclos)


Tengo dos entidades:

Parent {
   Child[] children;
}

and 

Child {
   Parent parent;
}

Estoy al tanto de @JsonBackReference y @JsonManagedReference. Son buenos, si estoy serializando instancias de Parent.

Pero también necesito transferir instancias de Child y quiero que se rellene el campo parent.

En otras palabras:

  1. En la serialización de Parent debería tener children pero su campo padre podría estar vacío (se puede resolver usando anotaciones de referencia json).
  2. En la serialización de Child debe tener parent con sus children (pero children no tienen que tener parent poblados.

¿Hay alguna manera de resolverlo usando las capacidades estándar de Jackson?

Es decir, omita la serialización de entidades que ya estaban serializadas en lugar de marcar campos elegibles o no elegibles para serialización.

Author: Eugene Retunsky, 2012-04-08

2 answers

Jackson 2.0 soporta referencias completas de objetos cíclicos. Ver " Jackson 2.0 released " (sección 'Manejar Cualquier Gráfico de Objetos, incluso Cíclicos!') por ejemplo.

Básicamente, necesitará usar new @JsonIdentityInfo para los tipos que requieren manejo de estilo id/idref. En su caso, esto sería ambos tipos Parent y Child (si uno extiende el otro, simplemente agréguelo a super type y está bien).

 36
Author: StaxMan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-09 17:21:24

La implementación de una interfaz muy práctica se proporciona en la biblioteca Jackson 2 como

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

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

En maven

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

@StaxMan proporcionó un buen enlace para comenzar desde

 18
Author: Oleksii Kyslytsyn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-07 01:21:02