基于https://jira.mongodb.org/browse/JAVA-1741我正在尝试实现和使用 TimestampCodec,并期望在读取 MongoCollection 时使用decode(),但由于某种原因,decode() 不是 执行后,数据库中的 IsoDate 值将转换为 java.util.Date,而不是预期的 java.sql.Timestamp。
检索 MongoCollection 时使用 TimestampCodec.decode() 的正确方法是什么?
我有以下内容,但失败并显示 java.lang.AssertionError: Expected:
@Test
public void testTimestamp() {
Map<BsonType, Class<?>> replacements = new HashMap<BsonType, Class<?>>();
replacements.put(BsonType.DATE_TIME, Timestamp.class);
BsonTypeClassMap bsonTypeClassMap = new BsonTypeClassMap(replacements);
DocumentCodecProvider documentCodecProvider =
new DocumentCodecProvider(bsonTypeClassMap);
CodecRegistry codecRegistry = CodecRegistries.fromRegistries(
CodecRegistries.fromCodecs(
new TimestampCodec()),
MongoClient.getDefaultCodecRegistry(),
CodecRegistries.fromProviders(documentCodecProvider));
Builder optionsBuilder = new MongoClientOptions.Builder();
optionsBuilder.codecRegistry(MongoCodecs.codecRegistry());
MongoClientOptions options = optionsBuilder.build();
MongoClient mongo = new MongoClient(new ServerAddress(), options);
MongoDatabase db = mongo.getDatabase("mydb");
MongoCollection<Document> collection = db.getCollection("test");
try {
collection.insertOne(new Document("date", new Timestamp(new Date().getTime())));
assertEquals(Timestamp[].class, collection.find().first().get("date").getClass());
} finally {
collection.drop();
mongo.close();
}
}
最佳答案
除了小错误之外,解决方案是更改编解码器注册表的顺序,使 MongoClient.getDefaultCodecRegistry() 成为最后一个。
正确的代码是:
@Test
public void testTimestamp() {
Map<BsonType, Class<?>> replacements = new HashMap<BsonType, Class<?>>();
replacements.put(BsonType.DATE_TIME, Timestamp.class);
BsonTypeClassMap bsonTypeClassMap = new BsonTypeClassMap(replacements);
DocumentCodecProvider documentCodecProvider =
new DocumentCodecProvider(bsonTypeClassMap);
CodecRegistry codecRegistry = CodecRegistries.fromRegistries(
CodecRegistries.fromCodecs(
new TimestampCodec()),
CodecRegistries.fromProviders(documentCodecProvider),
MongoClient.getDefaultCodecRegistry());
Builder optionsBuilder = new MongoClientOptions.Builder();
optionsBuilder.codecRegistry(codecRegistry);
MongoClientOptions options = optionsBuilder.build();
MongoClient mongo = new MongoClient(new ServerAddress(), options);
MongoDatabase db = mongo.getDatabase("mydb");
MongoCollection<Document> collection = db.getCollection("test");
try {
collection.insertOne(new Document("date", new Timestamp(new Date().getTime())));
assertEquals(Timestamp.class, collection.find().first().get("date").getClass());
} finally {
collection.drop();
mongo.close();
}
}
关于java - 如何让 MongoCollectoin 返回 java.sql.Timestamp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33419894/