Spring MVC - JSON récursion infinie
J'ai bi-directionnelle relation comme ça...
Person.java
public class Person{
@JsonIgnore
@OneToMany(targetEntity=PersonOrganization.class, cascade=CascadeType.ALL,
fetch=FetchType.EAGER, mappedBy="person")
private Set<PeopleOrg> organization;
.....
}
PersonOrganization.java
public class PersonOrganization{
@JsonIgnore
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="PERSONID", nullable=false)
private Person person;
}
Même avec @JsonIgnore
annotation, je suis une récursion infinie d'erreur lorsque vous essayez de récupérer des enregistrements de personnes. J'ai essayé de nouvelles annotations dans la version 1.6. @JsonBackReference
et @JsonManagedReference
. Même alors, je suis une récursion infinie..
Avec @JsonBackReference("person-organization")
sur Person
et @JsonManagedReference("person-organization")
sur 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]...
Même Si j'interchange les annotations, je suis encore en train cette exception.. s'il vous Plaît laissez-moi savoir si il ya quelque chose de mal avec les mappages de la façon dont je suis en utilisant JSON annotations. Grâce
Vous devez vous connecter pour publier un commentaire.
J'ai couru dans cette avant que. Mais après le déplacement de @JsonIgnore du domaine privé de de lecture du champ, une récursion infinie est allé. Donc, mon sauvage conjecture est que @JsonIgnore peut pas travailler sur le domaine privé. Cependant, javadoc ou tutoriel de Jackson Java JSON-processeur ne pas mentionner à ce sujet, donc je ne peux pas être sûr à 100%. Juste pour votre information.
Le lien suivant, vous devez annoter la méthode utilisée par JSON outil pour parcourir le graphe d'objets, d'instruire les il pour ignorer la traversée.
http://jackson.codehaus.org/1.0.1/javadoc/org/codehaus/jackson/annotate/JsonIgnore.html
Dans mon cas j'ai deux objets liés aime ce Produit <-> ProductImage. Donc parser JSON est entré dans une boucle infinie avec @JsonIgnore annotation sur le suivant pour obtenir des méthodes de
dans ProductImage et
dans le Produit.
Avec l'annotation, les choses fonctionnent très bien.
Je sais que cette question n'est pas spécifiquement sur les Données du Printemps de REPOS, mais je suis tombé sur cette exception dans le cadre du Printemps des Données de REPOS, et je voulais partager ce qu'était le problème. J'ai eu une relation bidirectionnelle impliquant une entité sans référentiel. Création du référentiel fait la boucle de disparaître.
Depuis Jackson 1.6 vous pouvez utiliser deux annotations pour résoudre la récursivité infinie problème sans en ignorer les getters/setters lors de la sérialisation: @JsonManagedReference et @JsonBackReference.
Pour plus de détails, reportez-vous https://stackoverflow.com/a/18288939/286588
Apparemment depuis Jackson 1.6 vous pouvez utiliser @JsonManagedReference et @JsonBackReference pour résoudre efficacement la récursivité infinie problème.
Je n'entrerai pas dans les détails, mais ce changement vous classes au-dessous de format devrait résoudre le problème.
Fondamentalement Jackson convertit
Set<PeopleOrg> organization
, la partie avant de la référence à un json comme format à l'aide de l'ordonnancement des processus, il cherche alors pourPerson 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
Si a a B & B a A.
C'est un à un relation, mais formant un rapport circulaire.
En toute de la classe, de l'utilisation JustIgnore annotation.
Cela s'applique pour d'autres relations aussi comme "un à plusieurs".
Cela peut être un peu vieux, mais vous pouvez ajouter @JsonIgnore au niveau de la classe avec toutes les propriétés qu'il doit ignorer. e.g
Parfois le champ de membre peut avoir intérieure de référence pour le même type de classe de lui-même, ce qui pourrait provoquer des une récursion infinie quand
toJson
.E. g.: vous avez un champ de membre
Klass a
, tandis que la définition de la classe de Klass est comme ci-dessous.Solution: refactoriser le champ de membre, d'éliminer l'intérieure de référence.
Cette exception est que, votre constructeur de champ ne sont pas correctes, veuillez vérifier votre constructeur propriétés une fois de plus dans vos classes, et de vérifier le mappage de donner correctement ou pas,
Garder les deux Constructeurs, c'est d'abord le zéro de la construction et de la deuxième constructeur est avec des champs, et les deux devraient contenir les super
Jackson travaille à la Réflexion, en appelant les méthodes de lecture. Moi aussi j'avais une telle situation où j'ai eu un getter de la même Objet à l'intérieur de sa classe. Jackson est allé dans une récursion infinie de manger de la pile plusieurs fois appel à ses propres électeurs. Retiré de lecture, puis il a fixé.
Mes Conseils :
Si vous souhaitez utiliser jackson pour la conversion d'un objet, ne jamais garder les accesseurs qui fait référence au même objet, comme dans le cas de singletons.