【问题标题】:Jackson Deep Nested Objects杰克逊深层嵌套对象
【发布时间】:2013-01-10 19:15:36
【问题描述】:

我有以下 java JPA 对象,它们在我的 spring rest 控制器方法中转换为 json,它们是

class User{
    @JsonManagedReference
    @OneToMany
    private Portfolio portfolio;
    .....
}

class Portfolio {
     @JsonBackReference
     @ManyToOne
 private User user;

    @JsonManagedReference
     private List<Order> orders;
     .....
}

class Order {
     @JsonBackReference
 private Portfolio portfolio;

     private User user;
}

在我的应用程序中,我需要 2 个服务:

  1. 登录: 返回 User 对象,带有 Portfolio 和 List of Orders 对象,我不需要 Order.user 对象。

  2. 获取订单: 返回一个订单列表,我需要 Order.user 对象。

Order.user 与父 User 对象不同。

我的问题是如何避免用户对象的无限递归问题?或者这只是一个糟糕的设计?

【问题讨论】:

    标签: json spring rest jackson


    【解决方案1】:

    @JsonManagedReference@JsonBackReference 的问题在于它们可以很好地处理一种非常特殊的(直接)循环引用,但并非旨在处理该狭窄窗口之外的任何内容(其中单个父对象直接相关)到一个或多个子对象)。不幸的是,您的用例不在该窗口内。

    所以你有两个选择:

    • 手动解决方法 - 在您的服务类中,您需要在序列化顶级 user 对象之前删除(设为 null)order.user 属性。相反,在序列化 orders 之前,您需要删除(设为 null)user.portfolio.orders 属性。

    • 框架解决方法 - 升级到 Jackson 2.0+ 并使用 @JsonIdentityInfo。它可以正确处理图形中的对象引用、多对多关系、深层对象树等。 Some documentation and examples.

    如果您可以控制ObjectMapper,您也可以解决此问题。如果你这样做了,那么你只需要根据你返回的对象指定一个自定义的序列化器来使用,但是由于你在 Spring 框架中工作,我不相信你可以直接控制映射器。

    我个人的建议是升级您的 Jackson 库并使用 @JsonIdentityInfo

    【讨论】:

    • 很好的答案,似乎是在学习杰克逊,谢谢
    猜你喜欢
    • 1970-01-01
    • 2016-01-14
    • 2016-12-07
    • 2019-11-15
    • 2021-10-02
    • 2015-02-04
    • 2018-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多