4

在我的 Spring MVC 应用程序中,我有三个类——Content、Category 和 Document——它们都是相互关联的,并且必须序列化为 JSON,但是这样做会导致无限循环。关系是这样的:

Content -> List<Category> -> List<Document> -> List<Content> -> (etc.)

其中 Category 是 Content 等的属性。我正在尝试对其进行序列化,以便引用以 List 结尾(以便 content.categories.documents 暴露给视图),但没有找到任何解决方法。使用 Jackson 的 @JsonManagedReference 和 @JsonBackReference 进行注释将不起作用,因为其中一些字段已经针对其他关系进行了注释。除了可能构建特定于相关视图的模型之外,不知道如何去做。

编辑:如果这有帮助,我得到的错误是“org.springframework.http.converter.HttpMessageNotWritableException:无法编写 JSON:无限递归(StackOverflowError)”,然后是引用链的跟踪。

4

4 回答 4

1

也许看看@JsonIdentityInfo注释,它可以用于处理循环依赖(这个条目提到它)?它不适用于Collections(唉),但适用于集合、数组和映射中包含的 POJO。

于 2013-07-11T00:16:41.217 回答
1

@JsonManagedReference并且@JsonBackReference他们可以处理的周期类型相当有限。特别是它们只能用于表示相当静态的父子类型关系。本质上,它们只能用于处理严格的层次结构。但是在大量的项目中,对象关系实际上是用一个来表示的,上面提到的两个注解根本无法处理。Jackson 的设计者意识到了这一点,并在库的 2.0 版中引入了一种处理对象身份的新机制

使用这种新机制,您可以使用注释来注释所有三个对象(和)Content,然后 Jackson 应该能够正确地序列化(和反序列化)它们。DocumentCategory@JsonIdentityInfo

简单的代码示例:

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
    property = "someUniquePropertyOfYourClass")
public class Context {
    // fields, constructors, getters/setters
}
于 2013-07-11T00:18:08.010 回答
0

您是否尝试过使用 @JsonIgnore ?当我在 Spring MVC 中使用 Hibernate 时,它​​在我的情况下效果更好。

于 2013-07-10T21:20:30.750 回答
0

你试过转换器吗?

使用其他两个类的转换器单独序列化每个类。例如,在序列化 Content 时,为 Category 和 Document 编写转换器。转换可以是类别和文档的标识符。在反序列化方面,首先获取对象并记住它们的关系。然后使用标识符重建它们的关系。

于 2013-07-10T21:38:28.433 回答