1

私は単純なポジョを持っています

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 です。

私の問題はドライバーレベルにあるようです。java.util.Date の代わりに java.time.LocalDateTime として日付を表すように mongo ドライバーに指示する方法はありますか?

4

1 に答える 1

0

あなたの問題はドライバーレベルではありません。MongoDB には、 の知識がまったくありませんjava.util.Date。しかし、BSON型は、内部表現でDateは とほぼ同じです。java.util.Dateありがたいことに、MongoDB シェルでは常にタイムゾーン Z を使用して出力されるため、タイムゾーンを無視して代わりに扱うことはそれほど混乱しませんjava.time.LocalDateTimeが、BSON レベルでそれを明示する組み込みの方法はありません。

マッパー レベルでは、必要なマッピングを指定する方法がいくつかあります。LocalDateTimeDeserializerあなたの質問から、どちらを使用しようとしたかは明確ではありません。java.time.LocalDateTimeただし、まず、 ではなくをターゲットとするものを使用していることを確認する必要がありますorg.joda.time.LocalDateTime。それを確認しても問題が解決しない場合は、Deserializer の代わりに独自の Converter を作成することを検討してください。これは、ほぼ同じアノテーションで呼び出します。

@JsonDeserialize(converter = LocalDateTimeConverter.class)

違いは、JSON ストリームをまったく処理するのではなく、 a から ajava.util.Dateへの convert メソッドを実装するだけでよいことです。org.joda.time.LocalDateTime

于 2015-12-22T03:54:08.660 に答える