1

我有一个简单的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?

4

1 回答 1

0

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

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

@JsonDeserialize(converter = LocalDateTimeConverter.class)

不同之处在于您只需要实现从 ajava.util.Date到 a的转换方法org.joda.time.LocalDateTime,而不是处理 JSON 流。

于 2015-12-22T03:54:08.660 回答