java - 无法使用 mongo 和 mongojack 反序列化 localdatetime

标签 java mongodb mongojack

我有一个简单的pojo

import lombok.Data;

@Data
public class DataPojo {
   private LocalDateTime myDate;           
}

当我尝试从 mongo + mongojack 读取 pojo 时

MongoCredential credential = MongoCredential.createCredential(userName, "aDb", password.toCharArray());
MongoClient mongoClient = new MongoClient(new ServerAddress(mongoServer), Arrays.asList(credential));
DB db = mongoClient.getDB("aDb");
DBCollection aCollection = db.getCollection("aCollection");

JacksonDBCollection<DataPojo, String> jDbCol = JacksonDBCollection.wrap(aCollection, DataPojo.class, String.class);
DataPojo d = jDbCol.findOne();

我收到以下错误

java.lang.RuntimeException: IOException encountered while reading from a byte array input stream
at org.mongojack.internal.stream.JacksonDBDecoder.decode(JacksonDBDecoder.java:67)
...
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Problem deserializing property 'myDate' (expected type: [simple type, class java.time.LocalDateTime]; actual type: java.util.Date), problem: argument type mismatch (through reference chain: DataPojo["myDate"])

我已经阅读了有关 @JsonDeserialize(using = LocalDateTimeDeserializer.class) 的内容,这只会导致其他错误。

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Unexpected token (VALUE_EMBEDDED_OBJECT), expected START_ARRAY: Expected array or string.

我使用的是 mongo-java-driver 版本 3.1.0-rc0,mongojack 版本 2.5.1。我运行的 mongodb 是 2.6.9。我试图读取的字段是 ISODate。

看来我的问题出在驱动程序级别。有没有办法告诉 mongo 驱动程序将日期表示为 java.time.LocalDateTime 而不是 java.util.Date?

最佳答案

您的问题不在于驱动程序级别; MongoDB 根本不了解java.util.Date。但 BSON Date 类型在内部表示中与 java.util.Date 几乎相同。值得庆幸的是,在 MongoDB shell 中,它始终使用时区 Z 进行打印,因此忽略时区并将其视为 java.time.LocalDateTime 并不会太困惑,但没有内置方法可以在 BSON 级别上明确这一点。

在映射器级别,您可以通过多种不同的方式在此处指定所需的映射。从您的问题来看,不清楚您尝试使用哪个 LocalDateTimeDeserializer ;但您首先要确保您使用的目标是 java.time.LocalDateTime,而不是 org.joda.time.LocalDateTime。如果您已经检查过但仍然遇到问题,那么您可以考虑编写自己的转换器而不是反序列化器,您可以使用几乎相同的注释来调用它:

@JsonDeserialize(converter = LocalDateTimeConverter.class)

区别在于,您只需要实现从 java.util.Dateorg.joda.time.LocalDateTime 的转换方法,而不需要处理 JSON 流。

关于java - 无法使用 mongo 和 mongojack 反序列化 localdatetime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34214392/

相关文章:

java - 无法使用 GeoTools 加载 shapefile

javascript - mongodb 中 db.collection.find() 的返回类型是什么

arrays - 从文档数组中删除最旧的 N 个元素

java - MongoJack 支持 @javax.persistance.Id 不起作用

java - Dropwizard 在有效 GET 上返回 400

java - Android 双向无限滚动列表

java - 在 MySql Workbench 中插入数据

javascript - 使用node.js异步系列插入错误

java.lang.IllegalAccessError 当试图从 MongoDB 制作 POJO 时?

java - 是否有一个 ExecutorService 为每个任务创建一个新线程?