簡體   English   中英

使用傑克遜序列化TreeModel

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM