本文將詳細介紹如何將 MongoDB 與 Spring 框架進行整合,並提供完整的代碼範例供參考。筆者在開發過程中踩過不少坑,特別是版本不匹配導致的各種錯誤,因此決定整理一份可直接運行的整合指南,希望能幫助大家避開這些陷阱。
在整合測試過程中,主要遇到以下兩個經典錯誤:
org/springframework/data/mapping/context/MappingContextAware 找不到類src-resolve: Cannot resolve the name 'repository:repository' to a(n) 'type definition'這些問題本質上都是 版本不匹配 引起的。特別是第二個錯誤,網路上許多解法提到引入 JPA,但本專案並未使用 JPA。最終解決辦法是升級 spring-data-commons 套件版本即可。
關鍵依賴版本(這兩個版本必須對應,否則極易出現各種離譜問題):
spring-data-commons-dist-1.4.0.M1spring-data-document-1.0.0.M2.zip官方下載地址:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="https://www.springframework.org/schema/beans"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xmlns:context="https://www.springframework.org/schema/context"
xmlns:mongo="https://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="
https://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context-3.0.xsd
https://www.springframework.org/schema/data/mongo https://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
https://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- MongoDB 連線配置 -->
<mongo:mongo host="192.168.0.138" port="27017"/>
<!-- MongoTemplate Bean 定義 -->
<bean id="mongoTemplate" class="org.springframework.data.document.mongodb.MongoTemplate">
<constructor-arg ref="mongo"/>
<constructor-arg name="databaseName" value="db"/>
<constructor-arg name="defaultCollectionName" value="person" />
</bean>
<!-- Repository Bean -->
<bean id="personRepository" class="com.mongo.dao.impl.PersonRepository">
<property name="mongoTemplate" ref="mongoTemplate"></property>
</bean>
<context:annotation-config />
</beans>
package com.mongo.dao;
import java.util.List;
import com.mongo.bean.Person;
public interface AbstractRepository {
void insert(Person person);
Person findOne(String id);
List<Person> findAll();
List<Person> findByRegex(String regex);
void removeOne(String id);
void removeAll();
void findAndModify(String id);
}
package com.mongo.dao.impl;
import java.util.List;
import java.util.regex.Pattern;
import org.springframework.data.document.mongodb.MongoTemplate;
import org.springframework.data.document.mongodb.query.Criteria;
import org.springframework.data.document.mongodb.query.Query;
import org.springframework.data.document.mongodb.query.Update;
import com.mongo.bean.Person;
import com.mongo.dao.AbstractRepository;
public class PersonRepository implements AbstractRepository {
private MongoTemplate mongoTemplate;
@Override
public List<Person> findAll() {
return getMongoTemplate().find(new Query(), Person.class);
}
@Override
public void findAndModify(String id) {
getMongoTemplate().updateFirst(
new Query(Criteria.where("id").is(id)),
new Update().inc("age", 3)
);
}
@Override
public List<Person> findByRegex(String regex) {
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Criteria criteria = new Criteria("name").regex(pattern.toString());
return getMongoTemplate().find(new Query(criteria), Person.class);
}
@Override
public Person findOne(String id) {
return getMongoTemplate().findOne(
new Query(Criteria.where("id").is(id)), Person.class);
}
@Override
public void insert(Person person) {
getMongoTemplate().insert(person);
}
@Override
public void removeAll() {
List<Person> list = this.findAll();
if (list != null) {
for (Person person : list) {
getMongoTemplate().remove(person);
}
}
}
@Override
public void removeOne(String id) {
Criteria criteria = Criteria.where("id").in(id);
if (criteria != null) {
Query query = new Query(criteria);
Person person = getMongoTemplate().findOne(query, Person.class);
if (person != null) {
getMongoTemplate().remove(person);
}
}
}
// Getter/Setter 略
}
package com.mongo.bean;
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = 3617931430808763429L;
private String id;
private String name;
private int age;
// 建構子、Getter/Setter、toString() 略
}
package com.mongo.test;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.mongo.bean.Person;
import com.mongo.dao.AbstractRepository;
import com.mongo.dao.impl.PersonRepository;
public class MongoTest {
private static Log log = LogFactory.getLog(MongoTest.class.getName());
private AbstractRepository pr = null;
public void init() {
log.debug("啟動開始");
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
pr = (PersonRepository) ctx.getBean("personRepository");
}
public void insert() {
Person p = new Person("cuiran", 27);
pr.insert(p);
log.debug("新增成功");
}
public void findOne() {
String id = "50c83cb552c2ceb0463177d6";
Person p = pr.findOne(id);
log.debug(p);
}
public void listAll() {
List<Person> list = pr.findAll();
log.debug("查詢結果如下:");
for (Person p : list) {
log.debug(p.toString());
}
}
public void start() {
init();
// insert();
// listAll();
findOne();
}
public static void main(String[] args) {
new MongoTest().start();
}
}
2012-12-12 16:23:59:DEBUG com.mongo.test.MongoTest - 啟動開始 2012-12-12 16:23:59:INFO org.springframework.context.support.ClassPathXmlApplicationContext - Refreshing... 2012-12-12 16:24:00:DEBUG com.mongo.test.MongoTest - Person[id=50c83cb552c2ceb0463177d6,name=cuiran,age=27]
執行成功!完整 Demo 原始碼可自行下載研究。