【发布时间】:2018-02-03 20:54:50
【问题描述】:
在我们的 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 视图中,它使用休息控制器来获取数据,有时 Order 有时 Items 是根对象。假设我们有某种“显示顺序”和另一个“显示项目”视图。
所以,如果Order 是根,我们还想知道它的子项(项目),如果Item 是根,我们还想知道它的父顺序。
序列化显然会产生无限递归,所以我们通常会在这里使用@JsonManagedReference 和@JsonBackReference。
但是,这删除了反向引用(所以我们在这里有一个单向序列化......)。我们还尝试使用JsonIdentityInfo - 这不起作用,因为elasticsearch在反序列化过程中存在一些问题,而且我们也有一些交叉引用,它们也将被ID替换并搞砸一切......
长话短说,我们现在的想法是进行某种“深度突破”:
- 当第一个序列化对象是
Order,那么它的items-property 应该被完全序列化。但是对于每个Item,对order的反向引用不应被序列化(可以在这里说“顺序深度为2”)。 - 当第一个序列化对象是
Item时,其反向引用order将被序列化,但对项的第二个托管引用将被忽略。
我们也为此尝试了 JsonView,但我们无法动态设置此值。
任何人解决了这个问题或有我们可以使用的方法?
【问题讨论】:
标签: java spring-mvc spring-boot jackson spring-data-jpa