2

我有以下模型:

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.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.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.serializeContents(StdContainerSerializers.java:122) 在 org.codehaus.jackson.map.ser .std.StdContainerSerializers$IndexedListSerializer.serializeContents(StdContainerSerializers.java:71) 在 org.codehaus.jackson.map.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:86) 在 org.codehaus.jackson.map.ser.BeanPropertyWriter org.codehaus.jackson.map.ser.std.BeanSerializerBase 中的 .serializeAsField(BeanPropertyWriter.java:446)。在 org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:446) 的 org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:112) 的序列化字段(BeanSerializerBase.java:150)在 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.serializeContents(StdContainerSerializers.java:122) at org.codehaus.jackson.map.ser.std.StdContainerSerializers$IndexedListSerializer.serializeContents(StdContainerSerializers.java:71) at org.codehaus.jackson .map.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:86) 在 org.codehaus.jackson.map.ser。BeanPropertyWriter.serializeAsField(BeanPropertyWriter.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.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.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.serializeContents(StdContainerSerializers.java:122) 在 org.codehaus.jackson .map.ser.std.StdContainerSerializers$IndexedListSerializer.serializeContents(StdContainerSerializers.java:71) 在 org.codehaus。jackson.map.ser.std.AsArraySerializerBase.serialize(AsArraySerializerBase.java:86) 在 org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.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.BeanPropertyWriter.serializeAsField(BeanPropertyWriter. 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.serializeContents(StdContainerSerializers.java:122) 在 org.codehaus.jackson.map.ser.std。StdContainerSerializers$IndexedListSerializer.serializeContents(StdContainerSerializers.java:71) 引起:java.lang.StackOverflowError

4

3 回答 3

6

正如drorb提到的那样,循环引用是问题所在。但是,您应该使用@JsonBackReference来指示循环引用,而不是使用 @JsonIgnore 注释。有了这个注解,Jackson 能够在反序列化时映射到正确的父级。

于 2013-02-18T11:05:55.720 回答
0

您的模型中有一个模型和模型1(父/子)之间的循环引用,杰克逊不会自动处理。您可以通过使用@JsonIgnore注释标记要忽略的引用之一来解决此问题。您可以在本文中找到更多信息

于 2013-02-18T10:55:47.607 回答
0

长话短说,我已经使用了以下建议

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;

这解决了我的问题。

于 2018-04-28T23:11:42.330 回答