2013-10-01 6 views
1

У меня есть два класса объектов: User класс с перечнем вопросов и Question класса с атрибутом пользователяStackOverflow ошибки при преобразовании JSon (спящий режим двунаправленного отображения)

класса пользователя Объявление:

@Entity 
    @Table(schema="test",name="so_user") 
    public class User { 
    private List<Question> questions; 
    //other attributes 
      @OneToMany(cascade=CascadeType.ALL) 
     @PrimaryKeyJoinColumn 
     public List<Question> getQuestions() { 
      return questions; 
     } 
    //.. other methods 
    } 

Вопрос объявление класса:

@Entity 
@Table(schema="test") 
public class Question { 
private User askedBy; 
//other attributes 
    @ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.EAGER) 
    @PrimaryKeyJoinColumn 
    public User getAskedBy() { 
    return askedBy; 
    } 

//.. other methods 
} 

Когда я пытаюсь преобразовать объект пользователя в Json с помощью Gson library, я t дает stackoverflow error. Причина: у пользователя есть список вопросов, и каждый вопрос, в свою очередь, имеет атрибут пользователя (используемый для двунаправленного отображения в спящем режиме).

тестовый код:

public class MappingTest { 
    public static void main(String[] args) { 
     List<User> users = null; 
     User user = null; 
     //populate some users 
     for (int i = 0; i < 10; i++) { 
      if (i == 0) 
       users = new ArrayList<User>(); 
      user = new User(); 
      List<Question> questions = null; 
      Question question = null; 
      //create dummy questions 
      for (int questionCount = 0; questionCount < 5; questionCount++) { 
       if(questionCount==0) 
        questions = new ArrayList<Question>(); 
       question = new Question(); 
       question.setAskedBy(user); 
       System.out.println("question added is "+question); 
       questions.add(question); 
      } 
      user.setQuestions(questions); 
      users.add(user); 
      System.out.println("user added is "+user); 
     } 
     //TODO 
     System.out.println(users); 
     Gson gson = new Gson(); 
     System.out.println(gson.toJson(users)); 

    } 
} 

журнала консоли:

Exception in thread "main" java.lang.StackOverflowError 
    at java.lang.AbstractStringBuilder.append(Unknown Source) 
    at java.lang.StringBuffer.append(Unknown Source) 
    at java.io.StringWriter.write(Unknown Source) 
    at com.google.gson.stream.JsonWriter.string(JsonWriter.java:534) 
    at com.google.gson.stream.JsonWriter.writeDeferredName(JsonWriter.java:402) 
    at com.google.gson.stream.JsonWriter.value(JsonWriter.java:495) 
    at com.google.gson.internal.bind.TypeAdapters$8.write(TypeAdapters.java:268) 
    at com.google.gson.internal.bind.TypeAdapters$8.write(TypeAdapters.java:253) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
    at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:892) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
    at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:892) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
    at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:892) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
    at com.google.gson.Gson$FutureTypeAdapter.write(Gson.java:892) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:96) 
    at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:60) 
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195) 
+1

Взгляните на это: http://stackoverflow.com/a/3341439/1360888 – giampaolo

ответ

1

Put Джексон API в вашем (com.fasterxml.jackson) приложения и использовать эти аннотации в realationship

@JsonBackReference к Обратные классы (списки или наборы в случае 1-в-N).

@JsonManagedReference to mappedBy classes (Single object in case 1-To-N).

В вашем случае

@OneToMany(cascade=CascadeType.ALL) 
@PrimaryKeyJoinColumn 
@JsonManagedReference 
public List<Question> getQuestions() { 
    return questions; 
} 

______________________________________ 


@ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.EAGER) 
@PrimaryKeyJoinColumn 
@JsonBackReference 
public User getAskedBy() { 
    return askedBy; 
} 

Вам нужно распечатать с JSON Джексона (не gson).

он работает со мной с двунаправленной рекурсией в сериализации.

+0

Это работало для меня ... +1 – Shamseer

 Смежные вопросы

  • Нет связанных вопросов^_^