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. 

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í:

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:


{
 "id":2,
 "itemName":"book",
 "owner":
    {
        "id":1,
        "name":"John"
    }
}