【问题标题】:Mongo ObjectId backward conversion from JSON to POJOMongo ObjectId 从 JSON 到 POJO 的反向转换
【发布时间】:2023-03-09 03:19:01
【问题描述】:

在我的数据库中,我有 ObjectId("5f78cd195a52a201fb117175") 的用户。

然后我通过 Spring REST 控制器将它发送到 Angular 前端,我的对象 ID 如下所示: {date: 1601752345000, timestamp: 1601752345} 然后在前端创建产品对象,其中包含字段 userId,其值设置为{date: 1601752345000, timestamp: 1601752345} 。该对象被发送到后端,然后保存在数据库中。问题是当 Jackson 在 Rest 控制器中转换它时,userId 字段的值是 ObjectId("5f78cd19065ece5ade441e7a")

所以从具有 ObjectId("5f78cd195a52a201fb117175") 的用户那里收到 ObjectId("5f78cd19065ece5ade441e7a") 我没有具有第二个 ObjectId 的用户,因此具有 userId 的字段不包含对真实用户的影响。

你知道它为什么会发生以及如何处理它吗?

【问题讨论】:

    标签: spring database mongodb jackson


    【解决方案1】:

    Jackson 将所有对象视为POJO 类型。默认情况下,序列化所有getter-s。假设,Java 中的 ObjectId 实例由 org.bson.types.ObjectId 表示,它有两个 getter-s:

    • getDate 在你的情况下 date JSON 中的字段
    • getTimestamp 在你的情况下 timestamp JSON 中的字段

    这两个字段将被序列化为JSON 有效载荷。反序列化过程需要构造函数和设置器。我想,在这种情况下会选择构造函数ObjectId​(int timestamp, int counter)(但我不确定)。您可以尝试使用此构造函数和来自您的 JSON 有效负载的值来创建 ObjectId 的新实例。

    当您使用Jackson 序列化/反序列化来自 3-rd 方库的类型时,您可以期望有一个为此实现的模块。看看MongoJack

    由于 MongoDB 使用 BSON(一种 JSON 的二进制形式)来存储它的 文档,JSON 映射器是映射 Java 的完美机制 对象到 MongoDB 文档。最好的 Java JSON 映射器是 杰克逊。 ...

    您需要注册此模块,并且序列化/反序列化过程应按预期工作。

    另见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-17
      • 2017-09-08
      • 2016-12-02
      • 2017-01-31
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多