簡體   English   中英

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

[英]Cannot deserialize localdatetime using mongo and 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目標。 如果您已經檢查過並且仍然遇到問題,則可以考慮編寫自己的Converter而不是Deserializer,使用幾乎相同的注釋調用它:

@JsonDeserialize(converter = LocalDateTimeConverter.class)

區別在於您只需要實現從java.util.Dateorg.joda.time.LocalDateTime的轉換方法,而不是完全處理JSON流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM