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

时间:2015-12-11 00:43:08

标签: 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?

1 个答案:

答案 0 :(得分:0)

您的问题不在司机级别; MongoDB根本不了解java.util.Date。但BSON Date类型与内部表示中的java.util.Date几乎相同。值得庆幸的是,在MongoDB shell中,它始终使用时区Z进行打印,所以不要忽略时区并将其视为java.time.LocalDateTime而不是太混乱,但是没有内置的方法可以在BSON级别进行显式调整。

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

@JsonDeserialize(converter = LocalDateTimeConverter.class)

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