我们的 Spring Boot (1.5.6) 应用程序在实体中有一个经典的双向 OneToMany 层次结构,例如一个Order
有许多Item
。
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToMany(mappedBy = "order", )
@JsonManagedReference
private Set<Item> items = new HashSet<>();
// getters and setters
}
public class Item {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToOne
@JsonBackReference
private Order order = new HashSet<>();
// getters and setters
}
在我们的 JavaScript View 中,它使用其余 Controller 来获取数据,有时 Order
和有时 Items
是根对象。假设我们有某种“显示顺序”和另一个“显示项目” View 。
因此,如果 Order
是根,我们还想知道它的子项(项目),如果 Item
是根,我们还想知道它的父项命令。
序列化显然会产生无限递归,因此我们通常会在这里使用 @JsonManagedReference
和 @JsonBackReference
。
然而,这消除了反向引用(所以我们在这里有一个单向序列化......)。我们还尝试使用 JsonIdentityInfo
- 这不起作用,因为elasticsearch在反序列化过程中出现了一些问题,而且我们还有一些交叉引用,它们也会被 ids 替换并弄乱一切......
长话短说,我们现在的想法是进行某种“深度突破”:
- 当第一个序列化对象是
Order
时,其items
属性应完全序列化。但对于每个Item
,对order
的反向引用不应被序列化(这里可以说“顺序深度为 2”)。 - 当第一个序列化对象是
Item
时,其反向引用order
会被序列化,但对项目的第二个托管引用将被忽略。
我们也尝试过 JsonView 来实现此目的,但我们无法动态设置该值。
有人解决了这个问题或者有我们可以使用的方法吗?
最佳答案
您可以使用@JsonIgnoreProperties
注释来代替@JsonManagedReference
和@JsonBackReference
来抑制嵌套属性的序列化:
public class Item {
//...
@JsonIgnoreProperties("items")
@ManyToOne
private Order order = new HashSet<>();
//...
}
关于java - Jackson 使用 Spring Boot 基于深度的序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45887624/