Plain Simple MongoDB Spring Integration

  • submit to reddit

Baruch is a high-level Java and training professional - consultant, architect and lecturer with more than 10 years of experience designing, developing, mentoring and lecturing on complex enterprise applications on the JVM Platform. Recently Baruch joined BMC Software as an innovations expert after completing 6 years in AlphaCSP as a senior consultant, architect and training center manager. Baruch is a DZone MVB and is not an employee of DZone and has posted 3 posts at DZone. View Full User Profile

You know what is MongoDB and what is Spring Framework and want to use the first inside the second? Here's short plain and simple integration between the two:

  • Properties file with server and database details (resides in classpath in this example):
db.host=localhost
db.port=27017
app.db.name=app
  1. application-config.xml (or whatever you call it):
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <context:property-placeholder
    location="classpath:db.properties"/>
    <bean id="mongo" class="com.mongodb.Mongo">
    <constructor-arg value="${db.host}"/>
    <constructor-arg value="${db.port}"/>
    </bean>
    <bean id="db"
    class="com.mongodb.spring.config.DbFactoryBean">
    <property name="mongo" ref="mongo"/>
    <property name="name" value="${app.db.name}"/>
    </bean>
    </beans>
  2. The com.mongodb.spring.config.DbFactoryBean class:
     public class DbFactoryBean implements FactoryBean<DB> {

    private Mongo mongo;
    private String name;

    @Override
    public DB getObject() throws Exception {
    Assert.notNull(mongo);
    Assert.notNull(name);
    return mongo.getDB(name);
    }

    @Override
    public Class<?> getObjectType() {
    return DB.class;
    }

    @Override
    public boolean isSingleton() {
    return true;
    }

    @Required
    public void setMongo(Mongo mongo) {
    this.mongo = mongo;
    }

    @Required
    public void setName(String name) {
    this.name = name;
    }
    }
    @Configuration
public class ApplicationConfiguration {

@Value("${app.db.name}")
private String appDbName;

@Value("${db.host}")
private String dbHost;

@Value("${db.port}")
private int dbPort;


@Bean
public DB db() throws UnknownHostException {
return mongo().getDB(appDbName);
}

@Bean
public Mongo mongo() throws UnknownHostException {
return new Mongo(dbHost, dbPort);
}
}

That's, actually, it - enjoy. If you feel some part of the puzzle is missing, please leave a comment.

This post was originally posted in my blog - http://jbaruch.wordpress.com

Article Type: 
How-to

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)

Comments

Steve Keylin replied on Sun, 2010/05/30 - 4:03pm

Lovely :-)

Andy Jefferson replied on Mon, 2010/05/31 - 3:59am

And you could take it further and use JPA/JDO with MongoDB using

http://code.google.com/p/datanucleus-store-mongodb/

Baruch Sadogursky replied on Mon, 2010/05/31 - 5:01am in response to: jpox1

Why would I want to work with non-relational database using relational API?

Manuel Jordan replied on Mon, 2010/05/31 - 2:35pm

BTW guys, Apress are in process to publish a book about Mongo http://www.apress.com/book/view/1430230517

-Manuel

Andy Jefferson replied on Mon, 2010/05/31 - 2:58pm in response to: jbaruch

Which part of JDO is "relational" exactly ? It was designed as datastore agnostic. Calling pm.makePersistent() is about as agnostic as it can get. For this exact reason, many OODBMS offer it as an API to their products

Baruch Sadogursky replied on Tue, 2010/06/01 - 2:21am in response to: jpox1

You mentioned both JPA and JDO. JPA is for RDBMS only,while JDO is not. My answer was about JPA, while you right about JDO.

Comment viewing options

Select your preferred way to display the comments and click "Save settings" to activate your changes.