java - 如何让 MongoCollectoin 返回 java.sql.Timestamp?

标签 java mongodb mongodb-java

基于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: but was:

@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/

相关文章:

java - Hibernate中buildSessionFactory时出现空指针异常

spring - 请使用“MongoMappingContext#setAutoIndexCreation(boolean)”或覆盖“MongoConfigurationSupport#autoIndexCreation()”以明确

java - 如何在 Java 中添加到现有的 MongoDB Bson 过滤器

java - 从 Eclipse 执行 android 测试用例与控制台远程检测

java - 如何保留日期信息?

c++ - 在 Cygwin 中构建 MongoDB C++ 驱动程序 : generate_error_codes. 找不到 py

MongoDb 连接被拒绝

java - 如何检索 DBObject 的架构?

java - 我必须在哪里放置 Tomcat 连接池的 JDBC 驱动程序?

mongodb - 如何覆盖 MongoDB 中的文档