2017-07-23 3 views
1

J'ai une classe mis en œuvre comme suit:Gson avec Hibernate - Erreur lorsque vous essayez de charger un attribut Lazy

public class User implements Serializable { 

@Id 
@Column(name = "USER_ID") 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private Long id; 

@Column(name = "USER_LOG") 
private String log; 

@Column(name = "USER_PASSWORD") 
private String password; 

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true) 
@JoinColumn(name = "CATG_USER_FK", 
     foreignKey = @ForeignKey(name = "CATG_TOUSERFK_FK") 
) 
private List<Category> categories; 

Comme vous pouvez le voir, la liste des catégories est chargé par Lazy Hibernate en cas de besoin.

Dans un autre morceau de code, je veux obtenir une chaîne JSON à partir d'un objet utilisateur chargé correctement Hibernate:

User oneUser = BBDDController.getUserById(1L); 
    System.out.println("User is: " + oneUser.getLog());//just to check. 
    //Now its time to transform to JSON. 
    Gson son = new Gson(); 
    String str= son.toJson(oneUser); 
    System.out.println("String of JSON: " + str); 

Et puis vient l'erreur:

Exception in thread "main" java.lang.StackOverflowError 
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:445) 
    at java.lang.StringBuffer.append(StringBuffer.java:270) 
    at java.io.StringWriter.write(StringWriter.java:101) 
    at com.google.gson.stream.JsonWriter.string(JsonWriter.java:566) 
    at com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:402) 
    at com.google.gson.stream.JsonWriter.value(JsonWriter.java:527) 
    at com.google.gson.internal.bind.TypeAdapters$11.write(TypeAdapters.java:310) 
    at com.google.gson.internal.bind.TypeAdapters$11.write(TypeAdapters.java:295) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:125) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:243) 
    at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:976) 

Cette erreur est répété encore et encore. Si j'essaie avec un faux utilisateur de charger une liste chargée par code (je veux dire, si je crée l'objet Utilisateur par code sans intervention d'Hibernate), Gson fonctionne bien.

De l'aide, s'il vous plaît? Chargement de Hibernate est bien, mais il semble que Lazy ne fonctionne pas avec Gson. La session Hibernate est toujours ouverte. Je veux éviter fetch = FetchType.EAGER dans l'utilisateur, et si j'essaie avec cette option, il se bloque de la même manière quand même.

Merci.

----- EDIT ------ Peut-être que Hibernate n'a rien à redire ici. J'ai essayé en créant une grande liste de catégories pour l'utilisateur, et l'erreur est la même. Peut-être y a-t-il une restriction avec le nombre d'éléments d'une liste ou d'un type de ces éléments dans Gson?

Répondre

1

Est-ce que la catégorie a référence à l'utilisateur? Si oui, il assez évident

gson utilisant reflecion son allant à la catégorie et de la catégorie à la même utilisateur

à ignorer propty pendant la sérialisation u peut utiliser

@Expose(serialize = false, deserialize = false) 
+0

Catégorie ne fait pas référence à l'utilisateur, mais il est vrai que Caregory peut faire référence à d'autres catégories. Alors, comment puis-je configurer Gson pour éviter les récurrences? Merci, Bartun. – Joseph

+0

Quoi qu'il en soit, j'ai lu quelque part que Gson est une mauvaise idée dans ce but, et c'est peut-être un Jackson un meilleur choix. Êtes-vous d'accord avec cela? – Joseph

+0

Jackson est à coup sûr plus populaire J'irais avec Jackson vous pourriez probablement trouver une comparaison en ligne – Bartun