我正在使用 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
实例应该与主应用程序中的相同。但显然不是。
之前也有人问过类似的问题。在这里查看这个问题:Jackson deserialize ISO8601 formatted date-time into Java8 Instant。另外这个问题也可能有帮助:Spring Data JPA - ZonedDateTime format for json serialization