#Connect dropwizard to MongoDB
dropwizard-mongo is a set of factories and health checks to be used with dropwizard for connecting to MongoDB.
Update 8/1: Major refactor that simplifies usage. Thanks to kgilmer for the review.
This project is brand new, so I have a lot of additional work to support the multiple options that can be passed to the MongoClient, DB, and DBCollection objects.
##Usage
The project artifacts are not currently hosted in a maven repository, so you will need to clone the repo and build the dropwizard-mongo project at a minimum.
I recommend you use dropwizard-mongo in combination with the MongoJack project for quickest implementation. The dropwizard-mongo-example project shows an example of using MongoJack with dropwizard-mongo.
If you want the factory to build a MongoClient object you can specify the connections in you config file.
mongoDB:
connections:
- host: localhost
port: 27017
- host: 192.168.1.12
port: 27017
If you want to the factory to build a DB object you will need to further specify the db name in the config.
mongoDB:
dbName: unittest
connections:
- host: localhost
port: 27017
- host: 192.168.1.12
port: 27017
Finally, the factory can return a DBCollection object you will need to further specify the collection name in the config.
mongoDB:
dbName: unittest
collName: test
connections:
- host: localhost
port: 27017
- host: 192.168.1.12
port: 27017
You will need to add a reference to MongoFactory in your class that extends Configuration or you can extend from com.eeb.dropwizardmongo.configuration.DropwizardMongoConfiguration.
@Valid
@NotNull
private MongoFactory mongoFactory = new MongoFactory();
@JsonProperty("mongoDB")
public MongoFactory getMongoFactory() {
return this.mongoFactory;
}
@JsonProperty("mongoDB")
public void setMongoFactory(MongoFactory MongoFactory) {
this.mongoFactory = MongoFactory;
}
Your class that extends from Application needs to be updated to register the health checks and call the factory method you wish to use. Once you have the object you want you can pass it to your dropwizard resources.
final MongoClient mongoClient = config.getMongoFactory().buildClient(environment);
environment.healthChecks().register("mongo",new MongoHealthCheck(mongoClient));
final MongoClient mongoClient = config.getMongoFactory().buildClient(environment);
//Register Resources
environment.jersey().register(new CollectionIdsResource(mongoClient));
final DB db = config.getMongoFactory().buildDB(environment);
//Register Resources
environment.jersey().register(new CollectionIdsResource(db));
final DBCollection coll = config.getMongoFactory().buildColl(environment);
//Register Resources
environment.jersey().register(new CollectionIdsResource(coll));
The secret sauce here is MongoJack. It lets me pass my Jackson API objects directly to the MongoDB API as well as returning the results of queries as my API objects.
Super basic API object representing a MongoDB document:
public class MongoDocument {
private String id;
@ObjectId
@JsonProperty("_id")
public String getId() {
return this.id;
}
@ObjectId
@JsonProperty("_id")
public void setId(String id) {
this.id = id;
}
}
My Resource's GET handler.
@GET
public List<MongoDocument> fetch(@PathParam("collection") String collection) {
JacksonDBCollection<MongoDocument, String> coll = JacksonDBCollection.wrap(mongoDB.getCollection(collection), MongoDocument.class,
String.class);
DBCursor<MongoDocument> cursor = coll.find();
List<MongoDocument> l = new ArrayList<>();
try {
while(cursor.hasNext()) {
l.add(cursor.next());
}
}finally {
cursor.close();
}
return l;
}
MongoJack provides wrappers for the standard MongoDB api calls that will parse MongoDB documents into objects that are Jackson annotated.