Ressort MVC-JSON infinite recursion

j'ai une relation bi-directionnelle comme celle-ci...

Personne.java

 public class Person{

    @JsonIgnore
    @OneToMany(targetEntity=PersonOrganization.class, cascade=CascadeType.ALL,
        fetch=FetchType.EAGER, mappedBy="person")
    private Set<PeopleOrg> organization;
    .....
 }

Personorganisation.java

  public class PersonOrganization{

    @JsonIgnore
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="PERSONID", nullable=false)
private Person person;
  }

Même @JsonIgnore annotation j'obtiens une erreur de récursion infinie en essayant de récupérer des dossiers de personnes. J'ai essayé de nouvelles annotations dans la version 1.6. @JsonBackReference et @JsonManagedReference. Même dans ce cas, j'ai une récursion infinie..

@JsonBackReference("person-organization")Person et @JsonManagedReference("person-organization")PersonOrganization

org.codehaus.jackson.map.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: com.entity.Person["organization"]->org.hibernate.collection.PersistentSet[0]->com.entity.PersonOrganization["person"]->com.entity.Person["organization"]->org.hibernate.collection.PersistentSet[0]...

Pair Si j'échange les annotations, j'obtiens toujours cette exception.. S'il vous plaît, faites-moi savoir s'il y a un problème avec les correspondances ou la façon dont j'utilise les annotations JSON. Merci

24
demandé sur Buhake Sindi 2012-01-27 22:07:28
la source

10 ответов

j'ai couru dans cette avant que. Mais après avoir déplacé @JsonIgnore de private field à getter du champ

le lien suivant dit que vous devriez annoter la méthode utilisée par l'outil JSON pour traverser le graphe d'objet, pour demander à l'it d'ignorer la traversée.

http://jackson.codehaus.org/1.0.1/javadoc/org/codehaus/jackson/annotate/JsonIgnore.html

ProductImage. Donc JSON parser est entré dans une boucle infinie avec out @JsonIgnore annotation sur ce qui suit pour obtenir des méthodes

@JsonIgnore
public Product getImageOfProduct() {
    return imageOfProduct;
}

dans ProductImage et

@JsonIgnore
public Set<ProductImage> getProductImages() {
    return productImages;
}

dans le Produit.

Avec l'annotation, les choses fonctionnent très bien.

10
répondu Venky Reddy 2012-05-10 10:42:07
la source

je sais que cette question ne concerne pas spécifiquement le repos des données de printemps, mais j'ai rencontré cette exception dans le contexte du repos des données de printemps, et je voulais partager ce qu'était le problème. J'ai eu une relation bidirectionnelle impliquant une entité sans référentiel. La création du dépôt a fait disparaître la boucle.

5
répondu Willie Wheeler 2013-05-07 21:26:41
la source

depuis Jackson 1.6 Vous pouvez utiliser deux annotations pour résoudre le problème de récursion infinie sans ignorer les getters / setters lors de la sérialisation: @Jsonmanagedref et @Jsonbackref.

pour plus de détails, voir https://stackoverflow.com/a/18288939/286588

4
répondu Farm 2017-05-23 15:10:05
la source

Si A A B & B A A.

C'est one to one relation, mais formant une relation circulaire.

dans n'importe quelle classe, utilisez L'annotation JustIgnore.

class A
{    
B b;    
}

class B
{    
@JsonIgnore
A a;
}

cela s'applique aussi à d'autres relations comme une à plusieurs.

1
répondu omkar sirra 2017-09-22 09:29:38
la source

c'est peut-être un peu vieux mais vous pouvez ajouter @JsonIgnore au niveau de la classe avec toutes les propriétés qu'elle devrait ignorer. e.g

@JsonIgnore("productImaes","...")
public class Product{ ...
}
0
répondu Srini 2016-01-06 21:53:09
la source

parfois le champ member peut avoir référence interne à la même classe type de lui-même, ce qui pourrait provoquer des récursion infinie quand toJson.

par exemple: vous avez un champ Membre Klass a, alors que la définition de classe de ce Klass est comme ci-dessous.

class Klass {
    Klass mySibling;

    public toString() {
        return "something" + mySibling.whateverMethod;
    }
}

Solution: refactoriser le champ de membre, d'éliminer l'intérieure de référence.

0
répondu Jing Li 2016-03-02 01:52:57
la source

Apparemment, depuis Jackson 1.6 vous pouvez utiliser @Jsonmanagedref et @JsonBackReference pour résoudre efficacement le problème de récursion infinie.

Je n'entrerai pas dans les détails mais le fait de changer vos classes au format ci-dessous devrait résoudre le problème.

 public class Person{

    @OneToMany(targetEntity=PersonOrganization.class, cascade=CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="person")
    @Column(nullable = true)
    @JsonManagedReference
    private Set<PeopleOrg> organization;
    .....
 }

public class PersonOrganization{

    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JoinColumn(name="PERSONID")
    @JsonBackReference
    private Person person;
  }

fondamentalement Jackson converts Set<PeopleOrg> organization, la partie avant de la référence a au format JSON-like en utilisant le processus de marshalling, il alors recherche Person person, la partie arrière de la référence et de ne pas sérialiser.

Crédits Kurt Bourbaki & plus d'info - http://keenformatics.blogspot.co.ke/2013/08/how-to-solve-json-infinite-recursion.html

0
répondu Amimo Benja 2017-07-05 11:58:43
la source

cette exception est due au fait que, votre champ de constructeur n'est pas correct, veuillez vérifier les propriétés de vos constructeurs une fois de plus dans vos classes, et vérifiez que le mappage donne correctement ou pas,

garder les deux constructeurs, le premier est construction zéro et le deuxième constructeur est avec des champs et les deux devraient contenir le super

0
répondu Sai Goud 2017-07-13 23:26:08
la source

Jackson travaille sur la réflexion en appelant getters. Moi aussi j'ai eu une telle situation où j'ai eu un getter du même objet dans sa classe. Jackson est entré dans la récursion infinie manger stack en appelant à plusieurs reprises son propre getter. Retiré de lecture, puis il a fixé.

Mon Conseil : Si vous voulez utiliser jackson pour la conversion d'un objet, ne gardez jamais getters qui fait référence au même objet, comme dans le cas de singletons.

-2
répondu Aryasindhu Sahu 2016-06-15 09:32:49
la source

Autres questions sur