【问题标题】:Jackson serialization issue. Only first object of the same entity serializes well杰克逊序列化问题。只有同一实体的第一个对象可以很好地序列化
【发布时间】:2020-12-17 09:36:17
【问题描述】:

我开发了一个 REST 投票系统,用户可以在其中对餐厅进行投票。我有一个包含用户、餐厅和日期的投票类。

public class Vote extends AbstractBaseEntity {

    @NotNull
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id")
    private User user;

    @NotNull
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "restaurant_id")
    private Restaurant restaurant;

    @Column(name = "date", nullable = false)
    @NotNull
    private LocalDate date;

}

我需要找到当天的所有选票。如果一个餐厅有几票,那么只有第一个对象可以很好地序列化。其他的显示餐厅 ID 而不是餐厅对象,如下所示:

[
    {
        "id": 100019,
        "user": null,
        "restaurant": {
            "id": 100004,
            "name": "KFC"
        },
        "date": "2020-08-28"
    },
    {
        "id": 100020,
        "user": null,
        "restaurant": 100004,
        "date": "2020-08-28"
    },
    {
        "id": 100021,
        "user": null,
        "restaurant": {
            "id": 100005,
            "name": "Burger King"
        },
        "date": "2020-08-28"
    },
    {
        "id": 100022,
        "user": null,
        "restaurant": 100005,
        "date": "2020-08-28"
    }
]

因此,KFC 的第一个投票显示完整的餐厅信息,但第二个仅显示 ID。汉堡王同样是下一个 2 票。

可能是什么问题?

【问题讨论】:

  • 你能告诉我们你是如何检索一天的选票的吗?问题可能是您将结果作为 Vote.class 列表获得,其中投票仅指一家餐厅而不是列表。
  • 我怀疑 "restaurant": 100004 是表投票中的外键。 "restaurant": {...} 是另一个表中引用的 Restaurant 对象。也许 getter 从 JSON 序列化程序中调用,有时返回键而不是对象。为了测试这个理论,您可以将数据复制到中间(非 JPA)pojo 并将该对象返回给 REST 层。

标签: java spring hibernate jackson


【解决方案1】:

你需要使用com.fasterxml.jackson.annotation.JsonIdentityInfo注解并为Restaurant类声明它:

@JsonIdentityInfo(generator = ObjectIdGenerators.None.class)
class Restaurant {

    private int id;
    ...
}

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 2016-04-18
    相关资源
    最近更新 更多