预先准备
配置版本
spring MVC 4.1.1
spring-data-mongodb 1.60
mongodb3.2.1
springMVC开发环境已经配好
mongodb添加用户
注意事项:mongodb3.0版本后密码加密有两种方式,MONGODB-CR两种方式,3.0版本之后默认为SCRAM-SHA-1,而spring mongodb默认是MONGODB-CR,此版本并不支持设置加密方式,导致常常出现如下问题:
org.springframework.data.mongodb.CannotGetMongoDbConnectionException: Failed to authenticate to database [xxxx], username = [xxxxx], password = [x******x]
org.springframework.data.mongodb.core.ReflectiveDbInvoker.authenticate(ReflectiveDbInvoker.java:83)
org.springframework.data.mongodb.core.MongoDbUtils.doGetDB(MongoDbUtils.java:127)
org.springframework.data.mongodb.core.MongoDbUtils.getDB(MongoDbUtils.java:94)
org.springframework.data.mongodb.core.SimpleMongoDbFactory.getDb(SimpleMongoDbFactory.java:203)
org.springframework.data.mongodb.core.SimpleMongoDbFactory.getDb(SimpleMongoDbFactory.java:191)
org.springframework.data.mongodb.core.MongoTemplate.getDb(MongoTemplate.java:1606)
org.springframework.data.mongodb.core.MongoTemplate.executeFindOneInternal(MongoTemplate.java:1839)
org.springframework.data.mongodb.core.MongoTemplate.doFindOne(MongoTemplate.java:1656)
org.springframework.data.mongodb.core.MongoTemplate.findOne(MongoTemplate.java:564)
org.springframework.data.mongodb.core.MongoTemplate.findOne(MongoTemplate.java:559)
com.oneday.ashop.core.base.mongo.BaseMongoDaoSupport.findOne(BaseMongoDaoSupport.java:81)
com.oneday.ashop.webgate.user.UserDao.findUser(UserDao.java:44)
com.oneday.ashop.webgate.user.UserService.login(UserService.java:88)
com.oneday.ashop.webgate.user.UserControl.login(UserControl.java:57)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
我们把mongodb的用户密码加密方式改为MONGODB-CR问题就解决了。
1.查看加密方式
db.system.version.findOne({"_id" : "authSchema"})
5:SCRAM-SHA-1
3:MONGODB-CR
2.如果当前的monggodb已经有了用户,要先删除掉所有用户:
mongo
use admin
db.system.users.remove({}) <== removing all users
db.system.version.remove({}) <== removing current version
db.system.version.insert({ "_id" : "authSchema", "currentVersion" : 3 })
3.重新添加用户:
>mongo
>use admin
>db.createUser({user:'admin',pwd:'123456', roles:[{role:'userAdminAnyDatabase', db:'admin'}]})
//用户角色可以百度
4.新建项目数据库-projectDB
注意事项:当我们新建projectDB后,一般会认为admin用户的权限是__system,该用户会拥有projectDB的一切权限,事实是也是如此,但是当在spring中用该admin进行登陆时,是没有权限的,关于这一点我目前还没有深究,也就是说必须为projectDB新建一个用户赋予dbadmin角色。
>use projectDB
>db.createUser({user:'projectUser',pwd:'123456', roles:[{role:'dbAdmin', db:'projectDB'}]})
spring 配置MongoDB连接
config.properties文件
mongo.locate=localhost:27017
mongo.dbname=projectDB
mongo.connectionsPerHost=4
mongo.threadsAllowedToBlockForConnectionMultiplier=20
mongo.connectTimeout=0
mongo.maxWaitTime=10000
mongo.autoConnectRetry=true
mongo.socketKeepAlive=true
mongo.socketTimeout=0
mongo.username=projectUser
mongo.password=123456
applicationContext.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<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"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd">
<!-- 加载属性配置文件 里面配置了mongodb的属性 -->
<context:property-placeholder location="classpath:config.properties"/>
<!-- 定义mongo对象,对应的是mongodb官方jar包中的Mongo,replica-set设置集群副本的ip地址和端口 -->
<mongo:mongo id="mongo" replica-set="${mongo.locate}">
<!-- 一些连接属性的设置 -->
<mongo:options
connections-per-host="${mongo.connectionsPerHost}"
threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
connect-timeout="${mongo.connectTimeout}"
max-wait-time="${mongo.maxWaitTime}"
auto-connect-retry="${mongo.autoConnectRetry}"
socket-keep-alive="${mongo.socketKeepAlive}"
socket-timeout="${mongo.socketTimeout}"
write-number="1"
write-timeout="0"
write-fsync="true"/>
</mongo:mongo>
<!-- mongo的工厂,通过它来取得mongo实例,dbname为mongodb的数据库名,没有的话会自动创建 -->
<mongo:db-factory dbname="${mongo.dbname}" mongo-ref="mongo"/>
<!--设置用户验证-->
<bean id="userCredentials" class="org.springframework.data.authentication.UserCredentials">
<constructor-arg name="username" value="${mongo.username}" />
<constructor-arg name="password" value="${mongo.password}" />
</bean>
<!-- mongodb的主要操作对象,所有对mongodb的增删改查的操作都是通过它完成 -->
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongo" ref="mongo"/>
<constructor-arg name="databaseName" value="${mongo.dbname}" />
<constructor-arg name="userCredentials" ref="userCredentials" />
</bean>
</beans>
这样就连接成功了。