[英]Serializing TreeModel using jackson
我有以下模型:
public class CategoryModel {
public String id;
public String name;
public String imageUrl;
public CategoryModel parent;
public List<CategoryModel> childrens = new ArrayList<CategoryModel>();
}
我正在使用Spring MVc + jackson返回Json。
我的行動建立以下模型,執行后,我得到stackoverflow異常。
List<CategoryModel> allCategories = new ArrayList<CategoryModel>();
CategoryModel model = new CategoryModel();
model.id = "1";
model.name = "category 1";
CategoryModel model1 = new CategoryModel();
model.id = "2";
model.name = "category 1.1";
model.childrens.add(model1);
model1.parent = model;
allCategories.add(model);
知道我有什么問題嗎?
這是日志文件(部分):
在org.codehaus.jackson處的org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150)在org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:446) org.codehaus.jackson.map.ser.std.StdContainerSerializers $ IndexedListSerializer.serializeContents(StdContainerSerializers.java:122)上的.map.ser.BeanSerializer.serialize(BeanSerializer.java:112),位於org.codehaus.jackson.map.ser org.codehaus.jackson.map中的.std.StdContainerSerializers $ IndexedListSerializer.serializeContents(StdContainerSerializers.java:71)位於org.codehaus.jackson.map.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:86)處。 org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.serialize(BeanSerializer.serialize(BeanSerializerBase.java:150)處的.serializeAsField(BeanPropertyWriter.java:446)在org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150) :112),位於org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanProp ertyWriter.java:446),位於org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150),位於org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112)在org.codehaus.jackson.map.ser.std.StdContainerSerializers $ IndexedListSerializer.serializeContent。(在org.codehaus.jackson的org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:446)的org.codehaus.jackson.map.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:86) org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112)的.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150)org.codehaus.jackson.map.ser.BeanPropertyWriter org.codehaus.jackson.map.ser.std.BeanSerializerBase上的.serializeAsField(BeanPropertyWriter.java:446)。 org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112)處的serializeFields(BeanSerializerBase.java:150)org.codehaus.jackson.map.ser.std.StdContainerSerializers $ IndexedListSerializer.serializeContentS(Stizer。 java:122),位於org.codehaus.jackson.map.ser.std.AsArraySerializerBase.serialize(AsArraySerializer)的org.codehaus.jackson.map.ser.std.StdContainerSerializers $ IndexedListSerializer.serializeContents(StdContainerSerializers.java:71)處。 86)在org.codehaus.org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150)在org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:446) org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:446)上的.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112)在org.codehaus.jackson.map.ser.std org.codehaus.jackson.map.ser的.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150) org.codehaus.jackson.map.ser.std.StdContainerSerializers $ IndexedListSerializer.serializeContents(StdContainerSerializers.java:122)處的BeanSerializer.serialize(BeanSerializer.java:112)在org.codehaus.jackson.map.ser.stedd.Std $ IndexedListSerializer.serializeContents(StdContainerSerializers.java:71)造成原因:java.lang.StackOverflowError
正如drorb所提到的,循環引用就是問題所在。 但是,應該使用@JsonBackReference來指示循環引用,而不是使用@JsonIgnore批注。 有了這個注釋,傑克遜能夠在反序列化時映射到正確的父對象。
模型中的模型和模型1(父/子)之間有一個循環引用,傑克遜不會自動處理該循環引用。 您可以通過使用@JsonIgnore批注標記要忽略的引用之一來解決此問題。 您可以在本文中找到更多信息
長話短說,我已經使用了以下建議
Summary.java
@OneToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "summary")
@JsonManagedReference
private List<Section> issueSections;
Section.java
@ManyToOne(fetch = FetchType.LAZY)
@JsonBackReference
@JoinColumn(name = "SUMMARY_ID", updatable = false)
private Summary summary;
這解決了我的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.