java - Jackson 使用 Spring Boot 基于深度的序列化

标签 java spring-mvc spring-boot jackson spring-data-jpa

我们的 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/

相关文章:

java - 无法使用 Java 8 运行 Spring 4 和 Tomcat 8

java - Java 中 XMLGregorianCalendar 的 NoClassDefFoundError

java - 错误7405 --- [主要] o.s.boot.SpringApplication : Application startup failed

java - 如何让@JsonIgnore 工作以便不递归返回 JSON?

java - 更改 JTextPane 上的打印边距

java - 如何知道是否在图形对象上单击

java - ActiveMQ:如果内存/数据存储已满,则进行故障转移

java - 是否可以在 Spring MVC(或 Boot)的外部目录中使用 .jsp 文件?

java - 带参数的 REST API 查询

java - 猜测随机数