如何配置MongoRepository以使用新的MongoClient API?

时间:2017-07-04 11:54:45

标签: mongodb spring-boot spring-data

我的旅程开始于我尝试将MongoDB的Java驱动程序配置为使用UUID v4而不是默认设置的Legacy UUID v3。

我在这里发现了这个解决方案https://groups.google.com/forum/#!msg/mongodb-user/ZJKQpMpCMU4/dW5ATHTcAvgJ

但正如他所说:

  

请注意,使用旧版API时,会忽略编解码器注册表   这不会使用重写的UUIDCodec

它不适用于我的MongoRepositoy

这是我的实际配置:

@Bean
public MongoDbFactory mongoDbFactory() throws Exception {

    ServerAddress server = new ServerAddress(host,port);

    MongoClientOptions.Builder mcoBuilder = MongoClientOptions.builder();
    CodecRegistry codecRegistry = fromRegistries(fromCodecs(new UuidCodec(UuidRepresentation.STANDARD)),
            MongoClient.getDefaultCodecRegistry());
    mcoBuilder.codecRegistry(codecRegistry).build();
    MongoClientOptions options = mcoBuilder.build();

    MongoClient mongoClient = new MongoClient(server,options);

    return new SimpleMongoDbFactory(mongoClient, mongoDataBase);
}

@Bean
public MongoTemplate mongoTemplate() throws Exception {
    MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory());
    return mongoTemplate;
}

如果我这样做:

mongoClient.getDatabase(mongoDataBase).getCollection("test")
.insertOne(new Document("_id",UUID.randomUUID()));

我明白了:

{ "_id" : BinData(4,"f0u8ig4TS6KaJGK93xmvNw==") }

否则:

mongoTemplate.getCollection("test")
.insert(new BasicDBObject("_id", UUID.randomUUID()));

结果:

{ "_id" : BinData(3,"mUX4PTPBJo6bIjPufHf0vg==") }

我知道MongoRepository使用MongoTemplate,虽然我已将实例设置为使用MongoClient而不是旧版Mongo,但仍然无效。有没有解决方案?

1 个答案:

答案 0 :(得分:4)

MongoClient扩展了Mongo,其通过DB引用了遗留api getDB()类。虽然您已使用MongoClient注册了新的UUID编解码器,但只有当您使用getDatabase()获取MongoDatabase春天模板当前版本并未使用getDB()时才能使用该编解码器for each table write the header write datas next table 。因此,您对注册表的更改从未使用过。

Spring MongoDB 2.0.0版本已更新为使用新的java驱动程序api。因此,您的更改应按预期在2.0.0版本上运行。

http://docs.spring.io/spring-data/data-mongo/docs/2.0.0.M4/reference/html/