1

我有以下 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. GetOrders:返回一个订单列表,我需要 Order.user 对象。

Order.user 与父 User 对象不同。

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

4

1 回答 1

2

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

所以你有两个选择:

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

  • 框架解决方法 - 升级到 Jackson 2.0+ 并使用@JsonIdentityInfo. 它可以正确处理图形中的对象引用、多对多关系、深层对象树等。一些文档和示例

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

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

于 2013-01-12T13:56:02.567 回答