前段时间被安排在老项目里集成一下mongodb,然后就遇到了一系列的问题,文章也是五花八门,答非所问,告诉你版本不对,实则配置有问题等等。
集成mongodb第一件事情就是要了解公司现在使用的mongodb版本是多少,我们现在服务器上用到的mongodb的版本是4.4的版本,然后再去选择对应的方法去集成使用mongodb,我的选择是使用MongoTemplate来操作mongodb,为什么选择使用MongoTemplate是因为spring封装了对他的很多使用方法,用起来和方便快捷,只需配置好mongodb剩下的交给spring去管理,spring对他的更新也有很多个版本,用起来相对稳定,资料也很多。接着我们引入jar包,先去spring官网看一下,找到Requirements:
我们的项目用的是jeesite的项目,jdk版本是1.7的,用到的sping版本是4.2.3的,显然我们的jdk跟spring的版本都不支持2.x以上的jar包,所以我们选择1.x的jar包,选一个较新且较多的release版本
引入pom:
<groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.10.15.RELEASE</version> </dependency>
引入1.10.15版本之后对应的Java驱动也下载下来,版本入下:
去mongodb官网找一下对应的版本支持,如果对应的java驱动不满足我们还需要手动导入以一下Java驱动来覆盖当前的驱动
配置mongodb.xml,配置前还是先看下文档
我们用到的版本是1.10.15,在1.8以后的版本中都将使用新标签mongo变成mongo-client,options改为client-options,在我第一次集成的时候没有看文档,导致遇到了很多问题,如果不按照上面文档写的配置就会报错,报错的内容很容易就能看懂
把标签改成文档要求的就可以了,下面贴一份正确的配置文件:
<?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/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.8.xsd"> <context:property-placeholder location="classpath*:mongodb.properties" /> <mongo:mongo-client id="mongoClient" host="${mongo.host}" port="${mongo.port}" credentials="${mongo.user}:${mongo.pwd}@${mongo.defaultDbName}"> <mongo:client-options connections-per-host="${mongo.connectionsPerHost}" min-connections-per-host="${mongo.minConnectionsPerHost}" threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}" connect-timeout="${mongo.connectTimeout}" max-wait-time="${mongo.maxWaitTime}" socket-keep-alive="${mongo.socketKeepAlive}" socket-timeout="${mongo.socketTimeout}" description="${mongo.description}" max-connection-idle-time="${mongo.maxConnectionIdleTime}" max-connection-life-time="${mongo.maxConnectionLifeTime}" heartbeat-socket-timeout="${mongo.heartbeatSocketTimeout}" heartbeat-connect-timeout="${mongo.heartbeatConnectTimeout}" min-heartbeat-frequency="${mongo.minHeartbeatFrequency}" heartbeat-frequency="${mongo.heartbeatFrequency}" /> </mongo:mongo-client> <mongo:db-factory id="mongoDbFactory" dbname="${mongo.project}" mongo-ref="mongoClient"/> <!-- 1.Spring提供的mongodb操作模板--> <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> <constructor-arg ref="mongoDbFactory" /> </bean> </beans>
最开始配置的时候因为没看文档还遇到了其他问题,就是在mongoDbFactory的配置写错了,下面写出错误的配置跟报错信息以及解决问题的方法:
错误的配置:
<mongo:db-factory id="mongoDbFactory" dbname="${mongo.defaultDbName}" host="${mongo.host}" port="${mongo.port}" username="${mongo.user}" password="${mongo.pwd}" mongo-ref="mongoClient"/>
报错信息:
Caused by: org.springframework.dao.InvalidDataAccessApiUsageException: Usage of 'UserCredentials' with 'MongoClient' is no longer supported. Please use 'MongoCredential' for 'MongoClient' or just 'Mongo'. at org.springframework.data.mongodb.core.SimpleMongoDbFactory.<init>(SimpleMongoDbFactory.java:139) at org.springframework.data.mongodb.core.SimpleMongoDbFactory.<init>(SimpleMongoDbFactory.java:95) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147) ... 26 more
解决方案:
上面的报错信息的意思就是不支持UserCredentials使用MongoClient,请使用MongoClient,UserCredentials这个单词的意思就是认证的意思,我们用到的mongodb版本是4.4,mongodb在版本3.0以上的版本就需要认证
简单贴一段源码,spring封装mongodbFactory是叫SimpleMongoDbFactory,他继承MongoDbFactory,报刚刚的错误也就是使用到SimpleMongoDbFactory的这个构造方法的时候报错,还是去官网,官网有很详细的配置及介绍:
文档详细的写了mongodb3.0版本应该怎配置,并且告诉你如果Java驱动换成3以上的版本时候将忽略以下属性
文档还提供了两种方式认证mongodb,一种通过Java代码的方式设置,一种是通过xml的方式配置
文档上明确写了对于认证的配置要写在mongo:mongo-client标签中,所以如果我们在mongo:db-factory标签中配置了上面的参数就会报上面的错误,至此整个项目集成mongodb就完成了。
这次集成以上我遇到了很多问题,一些版本问题比较多,我想说的是其实在做一个你没有做过的事情的时候我们大多数人会去搜索别人怎么使用的怎么集成的,我想说这个没有问题,但是网上很多人写的文章版本跟你的环境版本都不一样,所以直接复制很多情况下是是用不了的,复制的过程也要想想为什么这么配置,其实网上的文章很乱,很多都是在复制一个人的文章发表,错都是错一样的,还有的文章竟然还要收费,就上面的那个bug我搜到一个文章,文章竟然还要收费。我就不评论什么,我想说索然这个东西你可能没用过,但是多看看文档,多查查资料,这些问题一定是有办法解决的,所以遇到问题不要慌,静下心来,一定会解决问题的,我写文章不光是要记录下来这个错误对我的印象深刻,也是通过文章的方式告诉正在遇到此问题的同学问怎么解决这个问题。另外我们项目用到的是jeesite1.X的框架,其实就是人家搭好一套ssm的框架封装了一些方法更快捷高效的开发业务,我被安排集成mongodb的时间比较紧,所以我写了一个不是很通用的方法来实现功能,等功能上线后在没有给我安排工作的时候,我自己封装了一下mongo的使用,通过注解的方式添加到字段上就可以直接是查询到你想要的数据了,使用的人不需要知道怎么使用mongo也可以操作,这里代码就不贴出来了,因为我封装好的方法也只是为了满足我们系统使用jeesite的框架,其他项目也可以用,但是需要稍作修改。如果有同学需要可以评论私聊,我可以共享我封装的方法。