Бесконечная рекурсия с Джексоном

У меня проблемы с Jackson 1.6.3 и Hibernate. Я нашел эту тему здесь: Бесконечная рекурсия с Jackson JSON и Hibernate JPA выпуск

Но это не решило проблему.

У меня есть объект Node, который имеет входящие и исходящие отношения. Даже с аннотациями @JsonManagedReference на консоли сервера приложений я вижу выбрасываемые исключения (бесконечная рекурсия).

Есть ли альтернатива этому?

@Entity
@Table(name="nodes")
public class Node implements Serializable {

@Id
private String id;

@Column(name="x_pos")
private double x;


@Column(name="y_pos")
private double y;

@OneToMany
@JoinColumn(name="source")
@JsonManagedReference("outgoingRelations")
private Set<Relation> outgoingRelations;


@OneToMany
@JoinColumn(name="target")
@JsonManagedReference("incomingRelations")
private Set<Relation> incomingRelations;



@Entity
@Table(name="relations")
public class Relation implements Serializable {

@Id
private Long id;

@ManyToOne
@JoinColumn(name="source")
@JsonBackReference("outgoingRelations")
private Node source;

@ManyToOne
@JoinColumn(name="target")
@JsonBackReference("incomingRelations")
private Node target;

С уважением


person Vinicius Carvalho    schedule 08.11.2011    source источник


Ответы (2)


Из spring - бесконечная рекурсия с проблемой Jackson JSON и Hibernate JPA:

Вы можете использовать @JsonIgnore разорвать цикл.

person Matthew Cornell    schedule 24.01.2012
comment
За исключением того, что он не работает с объектами Hibernate 4.2.2 и javassist, а также с внутренними списками Hibernate. - person ndtreviv; 09.04.2014
comment
Здравствуйте, есть ли другой способ решить эту проблему? @JsonIgnore больше не работает. Спасибо - person José Mendes; 21.12.2016

Мы можем попытаться разорвать цикл либо в конце узла, либо в отношении, выполнив 3 способа.

  • Используйте @JsonManagedReference и @JsonBackReference
  • Используйте @JsonIdentityInfo
  • Используйте @JsonIgnore

Используйте @JsonIdentityInfo

    @Entity
    @Table(name = "nodes")
    @JsonIdentityInfo(
              generator = ObjectIdGenerators.PropertyGenerator.class, 
              property = "id")
    public class Node {
        ...
    }
    
    
    
    @Entity
    @Table(name = "relations")
    @JsonIdentityInfo(
              generator = ObjectIdGenerators.PropertyGenerator.class, 
              property = "id")
    public class Relation {
        ...
    }

Используйте @JsonIgnore

@OneToMany(fetch = FetchType.LAZY,mappedBy="node")
@JsonIgnore
private List<Node> lstNode;

Подробнее см. здесь, а также рабочую демонстрацию.

person MyTwoCents    schedule 11.05.2021