在 Spring Data MongoDB 中反序列化日期/时间

问题描述 投票:0回答:1

我正在使用 Spring Data MongoDB 来管理与 MongoDB 实例的通信。我有一个简单的文档类,包含 id 和

Instant
字段:

@Document
data class Test(
    @MongoId(FieldType.STRING)
    override var id: UUID,
    override val updatedAt: Instant,
)

该文档的一个实例被序列化到 Mongo 中(或者实际上在 Mongo shell 中显示为)

  {
    _id: '7ea1a5ff-0c3c-451f-9ebd-99def53541f5',
    updatedAt: ISODate('2023-10-09T11:43:51.152Z'),
  }

在 Spring 应用程序中使用时,反序列化可以正常工作。但是,出于测试目的,我还想从存储的 JSON 文件中读取文档。 JSON 序列化如下所示:

  {
    "_id": "c11f01c3-24a8-4321-a0ce-beb041207e5b",
    "updatedAt": {
      "$date": "2024-03-04T13:53:01.658Z"
    },
  }

我正在使用 Spring 配置的

ObjectMapper
实例来反序列化它(我假设应用程序中使用的实例相同),所以我希望一切都按预期工作。然而,显然
ObjectMapper
不知道 MongoDB 的具体信息,因此反序列化失败并显示

    Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.time.Instant` from Object value (token `JsonToken.START_OBJECT`)

如何配置

ObjectMapper
来正确处理 MongoDB 日期/时间?

注意:我读取测试数据的确切方式是这样的:

    @Bean
    fun repositoryPopulator(objectMapper: ObjectMapper) =
        Jackson2RepositoryPopulatorFactoryBean().apply {
            setMapper(objectMapper)
            setResources(paths)
        }

这是导入到

@SpringBootTest
的配置类中,所以这就是为什么我认为
ObjectMapper
实例应该与主应用程序中的相同。但显然不是。

spring jackson spring-data-mongodb
1个回答
0
投票

之前也有人问过类似的问题。在这里查看这个问题:Jackson deserialize ISO8601 formatted date-time into Java8 Instant。另外这个问题也可能有帮助:Spring Data JPA - ZonedDateTime format for json serialization

© www.soinside.com 2019 - 2024. All rights reserved.