diff --git a/mongodb/aggregation/src/main/java/example/springdata/mongodb/aggregation/ApplicationConfiguration.java b/mongodb/aggregation/src/main/java/example/springdata/mongodb/aggregation/ApplicationConfiguration.java index 6d5730c9..14f438a2 100644 --- a/mongodb/aggregation/src/main/java/example/springdata/mongodb/aggregation/ApplicationConfiguration.java +++ b/mongodb/aggregation/src/main/java/example/springdata/mongodb/aggregation/ApplicationConfiguration.java @@ -17,11 +17,10 @@ package example.springdata.mongodb.aggregation; import org.springframework.boot.autoconfigure.SpringBootApplication; -import com.mongodb.MongoClient; /** - * Test configuration to connect to a MongoDB named "test" and using a {@link MongoClient}. Also enables Spring Data - * repositories for MongoDB. + * Test configuration to connect to a MongoDB named "test" and using a {@link com.mongodb.client.MongoClient}. Also + * enables Spring Data repositories for MongoDB. * * @author Oliver Gierke */ diff --git a/mongodb/aggregation/src/test/java/example/springdata/mongodb/aggregation/SpringBooksIntegrationTests.java b/mongodb/aggregation/src/test/java/example/springdata/mongodb/aggregation/SpringBooksIntegrationTests.java index f17588f6..06861bda 100644 --- a/mongodb/aggregation/src/test/java/example/springdata/mongodb/aggregation/SpringBooksIntegrationTests.java +++ b/mongodb/aggregation/src/test/java/example/springdata/mongodb/aggregation/SpringBooksIntegrationTests.java @@ -30,6 +30,7 @@ import org.bson.Document; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.core.io.ClassPathResource; @@ -45,8 +46,6 @@ import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.test.context.junit4.SpringRunner; -import com.mongodb.util.JSON; - /** * Examples for Spring Books using the MongoDB Aggregation Framework. Data originates from Google's Book search. * @@ -70,7 +69,8 @@ public class SpringBooksIntegrationTests { File file = new ClassPathResource("books.json").getFile(); String content = Files.contentOf(file, StandardCharsets.UTF_8); - List books = (List) JSON.parse(content); + Document wrapper = Document.parse("{wrapper: " + content + "}"); + List books = wrapper.getList("wrapper", Object.class); operations.insert(books, "books"); } @@ -202,13 +202,13 @@ public class SpringBooksIntegrationTests { List mappedResults = result.getMappedResults(); BookFacetPerPage facet_20_to_100_pages = mappedResults.get(0); - assertThat(facet_20_to_100_pages.getMin()).isEqualTo(20); - assertThat(facet_20_to_100_pages.getMax()).isEqualTo(100); + assertThat(facet_20_to_100_pages.getId().getMin()).isEqualTo(20); + assertThat(facet_20_to_100_pages.getId().getMax()).isEqualTo(100); assertThat(facet_20_to_100_pages.getCount()).isEqualTo(12); BookFacetPerPage facet_100_to_500_pages = mappedResults.get(1); - assertThat(facet_100_to_500_pages.getMin()).isEqualTo(100); - assertThat(facet_100_to_500_pages.getMax()).isEqualTo(500); + assertThat(facet_100_to_500_pages.getId().getMin()).isEqualTo(100); + assertThat(facet_100_to_500_pages.getId().getMax()).isEqualTo(500); assertThat(facet_100_to_500_pages.getCount()).isEqualTo(63); assertThat(facet_100_to_500_pages.getTitles()).contains("Spring Data"); } @@ -280,9 +280,15 @@ public class SpringBooksIntegrationTests { @Value @Getter static class BookFacetPerPage { - int min; - int max; + BookFacetPerPageId id; int count; List titles; } + + @Value + @Getter + static class BookFacetPerPageId { + int min; + int max; + } } diff --git a/mongodb/change-streams/src/test/java/example/springdata/mongodb/ChangeStreamsTests.java b/mongodb/change-streams/src/test/java/example/springdata/mongodb/ChangeStreamsTests.java index 84dfd8f8..afe70102 100644 --- a/mongodb/change-streams/src/test/java/example/springdata/mongodb/ChangeStreamsTests.java +++ b/mongodb/change-streams/src/test/java/example/springdata/mongodb/ChangeStreamsTests.java @@ -21,6 +21,7 @@ import static org.springframework.data.mongodb.core.query.Criteria.*; import static org.springframework.data.mongodb.core.query.Query.*; import static org.springframework.data.mongodb.core.query.Update.*; +import com.mongodb.client.MongoClient; import example.springdata.mongodb.util.EmbeddedMongo; import reactor.core.publisher.Flux; import reactor.test.StepVerifier; @@ -41,7 +42,7 @@ import org.springframework.data.mongodb.core.ChangeStreamEvent; import org.springframework.data.mongodb.core.ChangeStreamOptions; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.ReactiveMongoOperations; -import org.springframework.data.mongodb.core.SimpleMongoDbFactory; +import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory; import org.springframework.data.mongodb.core.SimpleReactiveMongoDatabaseFactory; import org.springframework.data.mongodb.core.messaging.ChangeStreamRequest; import org.springframework.data.mongodb.core.messaging.DefaultMessageListenerContainer; @@ -50,7 +51,6 @@ import org.springframework.data.mongodb.core.messaging.MessageListenerContainer; import org.springframework.data.mongodb.core.messaging.Subscription; import org.springframework.test.context.junit4.SpringRunner; -import com.mongodb.MongoClient; import com.mongodb.client.model.changestream.ChangeStreamDocument; import com.mongodb.reactivestreams.client.MongoClients; @@ -101,8 +101,8 @@ public class ChangeStreamsTests { * @return a new {@link SimpleReactiveMongoDatabaseFactory}. */ @Bean - SimpleMongoDbFactory mongoDbFactory() { - return new SimpleMongoDbFactory(replSet.getMongoClient(), "changestreams"); + SimpleMongoClientDatabaseFactory mongoDbFactory() { + return new SimpleMongoClientDatabaseFactory(replSet.getMongoClient(), "changestreams"); } /** diff --git a/mongodb/example/src/main/java/example/springdata/mongodb/advanced/ApplicationConfiguration.java b/mongodb/example/src/main/java/example/springdata/mongodb/advanced/ApplicationConfiguration.java index 6888b1d9..71078c26 100644 --- a/mongodb/example/src/main/java/example/springdata/mongodb/advanced/ApplicationConfiguration.java +++ b/mongodb/example/src/main/java/example/springdata/mongodb/advanced/ApplicationConfiguration.java @@ -23,10 +23,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.mongodb.core.MongoOperations; -import com.mongodb.MongoClient; - /** - * Test configuration to connect to a MongoDB named "test" and using a {@link MongoClient} with profiling enabled. + * Test configuration to connect to a MongoDB named "test" and using a {@code MongoClient} with profiling enabled. * * @author Christoph Strobl */ diff --git a/mongodb/example/src/main/java/example/springdata/mongodb/customer/ApplicationConfiguration.java b/mongodb/example/src/main/java/example/springdata/mongodb/customer/ApplicationConfiguration.java index bc776684..9dec4148 100644 --- a/mongodb/example/src/main/java/example/springdata/mongodb/customer/ApplicationConfiguration.java +++ b/mongodb/example/src/main/java/example/springdata/mongodb/customer/ApplicationConfiguration.java @@ -17,10 +17,9 @@ package example.springdata.mongodb.customer; import org.springframework.boot.autoconfigure.SpringBootApplication; -import com.mongodb.MongoClient; /** - * Test configuration to connect to a MongoDB named "test" and using a {@link MongoClient}. Also enables Spring Data + * Test configuration to connect to a MongoDB named "test" and using a {@code MongoClient}. Also enables Spring Data * repositories for MongoDB. * * @author Oliver Gierke diff --git a/mongodb/example/src/main/java/example/springdata/mongodb/immutable/ApplicationConfiguration.java b/mongodb/example/src/main/java/example/springdata/mongodb/immutable/ApplicationConfiguration.java index 9e2c5239..32de4540 100644 --- a/mongodb/example/src/main/java/example/springdata/mongodb/immutable/ApplicationConfiguration.java +++ b/mongodb/example/src/main/java/example/springdata/mongodb/immutable/ApplicationConfiguration.java @@ -21,10 +21,9 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.data.mongodb.core.mapping.event.BeforeConvertCallback; -import com.mongodb.MongoClient; /** - * Test configuration to connect to a MongoDB named "test" using a {@link MongoClient}.
+ * Test configuration to connect to a MongoDB named "test" using a {@code MongoClient}.
* Also enables Spring Data repositories for MongoDB. * * @author Mark Paluch diff --git a/mongodb/querydsl/src/main/java/example/springdata/mongodb/imperative/ApplicationConfiguration.java b/mongodb/querydsl/src/main/java/example/springdata/mongodb/imperative/ApplicationConfiguration.java index 36c8c923..cd37478d 100644 --- a/mongodb/querydsl/src/main/java/example/springdata/mongodb/imperative/ApplicationConfiguration.java +++ b/mongodb/querydsl/src/main/java/example/springdata/mongodb/imperative/ApplicationConfiguration.java @@ -17,10 +17,8 @@ package example.springdata.mongodb.imperative; import org.springframework.boot.autoconfigure.SpringBootApplication; -import com.mongodb.MongoClient; - /** - * Configuration to connect to MongoDB using a {@link MongoClient}.
+ * Configuration to connect to MongoDB using a {@code MongoClient}.
* Enables Spring Data repositories for MongoDB. * * @author Christoph Strobl diff --git a/mongodb/text-search/src/main/java/example/springdata/mongodb/textsearch/MongoTestConfiguration.java b/mongodb/text-search/src/main/java/example/springdata/mongodb/textsearch/MongoTestConfiguration.java index b4811cc6..3769038a 100644 --- a/mongodb/text-search/src/main/java/example/springdata/mongodb/textsearch/MongoTestConfiguration.java +++ b/mongodb/text-search/src/main/java/example/springdata/mongodb/textsearch/MongoTestConfiguration.java @@ -15,6 +15,7 @@ */ package example.springdata.mongodb.textsearch; +import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.springframework.beans.factory.annotation.Autowired; @@ -24,11 +25,13 @@ import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.data.mongodb.core.MongoOperations; +import org.springframework.data.mongodb.core.index.IndexResolver; import org.springframework.data.repository.init.Jackson2RepositoryPopulatorFactoryBean; /** * @author Christoph Strobl * @author Oliver Gierke + * @author Mark Paluch */ @Configuration @SpringBootApplication @@ -43,6 +46,14 @@ public class MongoTestConfiguration { return factoryBean; } + @PostConstruct + private void postConstruct() { + + IndexResolver resolver = IndexResolver.create(operations.getConverter().getMappingContext()); + + resolver.resolveIndexFor(BlogPost.class).forEach(operations.indexOps(BlogPost.class)::ensureIndex); + } + /** * Clean up after execution by dropping used test db instance. * diff --git a/mongodb/transactions/src/test/java/example/springdata/mongodb/imperative/TransitionServiceTests.java b/mongodb/transactions/src/test/java/example/springdata/mongodb/imperative/TransitionServiceTests.java index ec489c5d..2003463b 100644 --- a/mongodb/transactions/src/test/java/example/springdata/mongodb/imperative/TransitionServiceTests.java +++ b/mongodb/transactions/src/test/java/example/springdata/mongodb/imperative/TransitionServiceTests.java @@ -26,20 +26,21 @@ import org.bson.Document; import org.junit.ClassRule; import org.junit.Test; import org.junit.runner.RunWith; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; -import org.springframework.data.mongodb.MongoDbFactory; +import org.springframework.data.mongodb.MongoDatabaseFactory; import org.springframework.data.mongodb.MongoTransactionManager; -import org.springframework.data.mongodb.config.AbstractMongoConfiguration; +import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; -import com.mongodb.MongoClient; +import com.mongodb.client.MongoClient; import com.mongodb.client.model.Filters; import com.mongodb.client.model.Projections; @@ -59,16 +60,16 @@ public class TransitionServiceTests { static final String DB_NAME = "spring-data-tx-examples"; @Autowired TransitionService transitionService; - @Autowired com.mongodb.MongoClient client; + @Autowired MongoClient client; @Configuration @ComponentScan @EnableMongoRepositories @EnableTransactionManagement - static class Config extends AbstractMongoConfiguration { + static class Config extends AbstractMongoClientConfiguration { @Bean - PlatformTransactionManager transactionManager(MongoDbFactory dbFactory) { + PlatformTransactionManager transactionManager(MongoDatabaseFactory dbFactory) { return new MongoTransactionManager(dbFactory); } diff --git a/mongodb/util/src/main/java/example/springdata/mongodb/util/EmbeddedMongo.java b/mongodb/util/src/main/java/example/springdata/mongodb/util/EmbeddedMongo.java index 831a1817..d5213385 100644 --- a/mongodb/util/src/main/java/example/springdata/mongodb/util/EmbeddedMongo.java +++ b/mongodb/util/src/main/java/example/springdata/mongodb/util/EmbeddedMongo.java @@ -45,11 +45,12 @@ import org.junit.AssumptionViolatedException; import org.junit.rules.ExternalResource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; -import com.mongodb.MongoClient; -import com.mongodb.MongoClientURI; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; /** * {@link org.junit.rules.TestRule} for a MongoDB server resource that is started/stopped along the test lifecycle. @@ -240,7 +241,7 @@ public class EmbeddedMongo extends ExternalResource { String connectionString(); default MongoClient mongoClient() { - return new MongoClient(new MongoClientURI(connectionString())); + return MongoClients.create(connectionString()); } } diff --git a/mongodb/util/src/main/java/example/springdata/mongodb/util/MongosSystemForTestFactory.java b/mongodb/util/src/main/java/example/springdata/mongodb/util/MongosSystemForTestFactory.java index ea670074..7cc0458a 100644 --- a/mongodb/util/src/main/java/example/springdata/mongodb/util/MongosSystemForTestFactory.java +++ b/mongodb/util/src/main/java/example/springdata/mongodb/util/MongosSystemForTestFactory.java @@ -15,19 +15,6 @@ */ package example.springdata.mongodb.util; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.Map.Entry; - -import com.mongodb.*; -import de.flapdoodle.embed.process.config.IRuntimeConfig; -import de.flapdoodle.embed.process.config.io.ProcessOutput; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import de.flapdoodle.embed.mongo.Command; import de.flapdoodle.embed.mongo.MongodExecutable; import de.flapdoodle.embed.mongo.MongodProcess; @@ -37,7 +24,34 @@ import de.flapdoodle.embed.mongo.MongosProcess; import de.flapdoodle.embed.mongo.MongosStarter; import de.flapdoodle.embed.mongo.config.IMongodConfig; import de.flapdoodle.embed.mongo.config.IMongosConfig; +import de.flapdoodle.embed.mongo.config.Net; import de.flapdoodle.embed.mongo.config.RuntimeConfigBuilder; +import de.flapdoodle.embed.process.config.IRuntimeConfig; +import de.flapdoodle.embed.process.config.io.ProcessOutput; +import lombok.SneakyThrows; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.concurrent.TimeUnit; +import java.util.function.Function; + +import org.bson.Document; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.mongodb.BasicDBList; +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; +import com.mongodb.MongoClientSettings; +import com.mongodb.ServerAddress; +import com.mongodb.client.FindIterable; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; +import com.mongodb.client.MongoCursor; +import com.mongodb.client.MongoDatabase; class MongosSystemForTestFactory { @@ -113,16 +127,14 @@ class MongosSystemForTestFactory { mongodProcessList.add(process); } Thread.sleep(1000); - MongoClientOptions mo = MongoClientOptions.builder() - .connectTimeout(10) + MongoClientSettings mo = MongoClientSettings.builder() + .applyToSocketSettings(builder -> builder.connectTimeout(10, TimeUnit.SECONDS)).applyToClusterSettings( + builder -> builder.hosts(Collections.singletonList(toAddress(mongoConfigList.get(0).net())))) .build(); - MongoClient mongo = new MongoClient(new ServerAddress(mongoConfigList.get(0).net() - .getServerAddress().getHostName(), mongoConfigList.get(0).net() - .getPort()), mo); - DB mongoAdminDB = mongo.getDB(ADMIN_DATABASE_NAME); + MongoClient mongo = MongoClients.create(mo); + MongoDatabase mongoAdminDB = mongo.getDatabase(ADMIN_DATABASE_NAME); - CommandResult cr = mongoAdminDB - .command(new BasicDBObject("isMaster", 1)); + Document cr = mongoAdminDB.runCommand(new Document("isMaster", 1)); logger.info("isMaster: {}", cr); // Build BSON object replica set settings @@ -141,19 +153,19 @@ class MongosSystemForTestFactory { replicaSetSetting.put("members", members); logger.info(replicaSetSetting.toString()); // Initialize replica set - cr = mongoAdminDB.command(new BasicDBObject("replSetInitiate", + cr = mongoAdminDB.runCommand(new Document("replSetInitiate", replicaSetSetting)); logger.info("replSetInitiate: {}", cr); Thread.sleep(5000); - cr = mongoAdminDB.command(new BasicDBObject("replSetGetStatus", 1)); + cr = mongoAdminDB.runCommand(new Document("replSetGetStatus", 1)); logger.info("replSetGetStatus: {}", cr); // Check replica set status before to proceed while (!isReplicaSetStarted(cr)) { logger.info("Waiting for 3 seconds..."); Thread.sleep(1000); - cr = mongoAdminDB.command(new BasicDBObject("replSetGetStatus", 1)); + cr = mongoAdminDB.runCommand(new Document("replSetGetStatus", 1)); logger.info("replSetGetStatus: {}", cr); } @@ -161,16 +173,16 @@ class MongosSystemForTestFactory { mongo = null; } - private boolean isReplicaSetStarted(BasicDBObject setting) { + private boolean isReplicaSetStarted(Document setting) { if (setting.get("members") == null) { return false; } - BasicDBList members = (BasicDBList) setting.get("members"); - for (Object m : members.toArray()) { - BasicDBObject member = (BasicDBObject) m; + List members = (List) setting.get("members"); + for (Object m : members) { + Document member = (Document) m; logger.info(member.toString()); - int state = member.getInt("state"); + int state = member.getInteger("state", 0); logger.info("state: {}", state); // 1 - PRIMARY, 2 - SECONDARY, 7 - ARBITER if (state != 1 && state != 2 && state != 7) { @@ -202,14 +214,13 @@ class MongosSystemForTestFactory { } private void configureMongos() throws Exception { - CommandResult cr; - MongoClientOptions options = MongoClientOptions.builder() - .connectTimeout(10) + Document cr; + MongoClientSettings options = MongoClientSettings.builder() + .applyToSocketSettings(builder -> builder.connectTimeout(10, TimeUnit.SECONDS)) + .applyToClusterSettings(builder -> builder.hosts(Collections.singletonList(toAddress(this.config.net())))) .build(); - try (MongoClient mongo = new MongoClient( - new ServerAddress(this.config.net().getServerAddress() - .getHostName(), this.config.net().getPort()), options)) { - DB mongoAdminDB = mongo.getDB(ADMIN_DATABASE_NAME); + try (MongoClient mongo = MongoClients.create(options)) { + MongoDatabase mongoAdminDB = mongo.getDatabase(ADMIN_DATABASE_NAME); // Add shard from the replica set list for (Entry> entry : this.replicaSets @@ -226,46 +237,47 @@ class MongosSystemForTestFactory { + ":" + mongodConfig.net().getPort(); } logger.info("Execute add shard command: {}", command); - cr = mongoAdminDB.command(new BasicDBObject("addShard", command)); + cr = mongoAdminDB.runCommand(new Document("addShard", command)); logger.info(cr.toString()); } logger.info("Execute list shards."); - cr = mongoAdminDB.command(new BasicDBObject("listShards", 1)); + cr = mongoAdminDB.runCommand(new Document("listShards", 1)); logger.info(cr.toString()); // Enabled sharding at database level logger.info("Enabled sharding at database level"); - cr = mongoAdminDB.command(new BasicDBObject("enableSharding", + cr = mongoAdminDB.runCommand(new Document("enableSharding", this.shardDatabase)); logger.info(cr.toString()); // Create index in sharded collection logger.info("Create index in sharded collection"); - DB db = mongo.getDB(this.shardDatabase); - db.getCollection(this.shardCollection).createIndex(this.shardKey); + MongoDatabase db = mongo.getDatabase(this.shardDatabase); + db.getCollection(this.shardCollection).createIndex(new Document(this.shardKey, 1)); // Shard the collection logger.info("Shard the collection: {}.{}", this.shardDatabase, this.shardCollection); - DBObject cmd = new BasicDBObject(); + Document cmd = new Document(); cmd.put("shardCollection", this.shardDatabase + "." + this.shardCollection); cmd.put("key", new BasicDBObject(this.shardKey, 1)); - cr = mongoAdminDB.command(cmd); + cr = mongoAdminDB.runCommand(cmd); logger.info(cr.toString()); logger.info("Get info from config/shards"); - DBCursor cursor = mongo.getDB("config").getCollection("shards").find(); - while (cursor.hasNext()) { - DBObject item = cursor.next(); + FindIterable cursor = mongo.getDatabase("config").getCollection("shards").find(); + MongoCursor iterator = cursor.iterator(); + while (iterator.hasNext()) { + Document item = iterator.next(); logger.info(item.toString()); } } } - public Mongo getMongo() throws UnknownHostException, MongoException { - return new MongoClient(new ServerAddress(mongosProcess.getConfig().net() - .getServerAddress(), mongosProcess.getConfig().net().getPort())); + @SneakyThrows + private static ServerAddress toAddress(Net net) { + return new ServerAddress(net.getServerAddress(), net.getPort()); } public void stop() { diff --git a/multi-store/src/main/java/example/springdata/multistore/ApplicationConfiguration.java b/multi-store/src/main/java/example/springdata/multistore/ApplicationConfiguration.java index cbde5270..26c22aae 100644 --- a/multi-store/src/main/java/example/springdata/multistore/ApplicationConfiguration.java +++ b/multi-store/src/main/java/example/springdata/multistore/ApplicationConfiguration.java @@ -17,10 +17,9 @@ package example.springdata.multistore; import org.springframework.boot.autoconfigure.SpringBootApplication; -import com.mongodb.MongoClient; /** - * Test configuration to connect to a MongoDB named "test" and using a {@link MongoClient}. Also enables Spring Data + * Test configuration to connect to a MongoDB named "test" and using a {@code MongoClient}. Also enables Spring Data * repositories for MongoDB. * * @author Oliver Gierke