Para evitar dependencias circulares al obtener objetos de base de datos y serializarlos, disponemos de las anotaciones @JsonBackReference y @JsonManagedReference, que utilizaremos sobre los atributos que forman la relación bidireccional.
- @JsonManagedReference se utiliza en la clase "padre" de la relación bidireccional, es decir, la que se mostrará de forma normal.
- @JsonBackReference es en el que sería el "hijo", la parte que se omitirá al ser serializado.
Podemos poner el siguiente ejemplo, con una clase User que tiene una lista de Item, y la clase Item que tiene un atributo User. Si queremos que al obtener el Item se incluya su User, pero que al mostrar este User se omita la lista de Items (lo que generaría un bucle infinito), pondríamos las anotaciones así:
| Bloque de código |
|---|
|
public class User {
public int id;
public String name;
public List<Item> userItems;
@JsonBackReference
public List<Item> getUserItems() {
return userItems;
}
}
public class Item {
public int id;
public String itemName;
public User owner;
@JsonManagedReference
public User getOwner() {
return owner;
}
} |
Así, un ejemplo de respuesta al obtener un Item sería este:
| Bloque de código |
|---|
|
{
"id":2,
"itemName":"book",
"owner":
{
"id":1,
"name":"John"
}
} |