【问题标题】:Jackson with Spring Boot depth-based serialization杰克逊与 Spring Boot 基于深度的序列化
【发布时间】: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


    【解决方案1】:

    除了@JsonManagedReference@JsonBackReference,您可以使用@JsonIgnoreProperties 注释来抑制嵌套属性的序列化:

    public class Item {
    
       //...
    
       @JsonIgnoreProperties("items") 
       @ManyToOne
       private Order order = new HashSet<>();
    
       //...
    } 
    

    【讨论】:

    • 哦该死 - 这么简单 - 不知道这个......谢谢!
    • 这是完美的。来自未来的感谢
    猜你喜欢
    • 2014-08-06
    • 2018-09-25
    • 2023-03-18
    • 2012-09-10
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多