HTTP Status 500 - Request processing failed; nested exception is org.springframework.data.mongodb.CannotGetMongoDbConnectionException: Failed to authenticate to database [lxkdb], username = [tester], password = [p******d]
type Exception report
message Request processing failed; nested exception is org.springframework.data.mongodb.CannotGetMongoDbConnectionException: Failed to authenticate to database [lxkdb], username = [tester], password = [p******d]
description The server encountered an internal error that prevented it from fulfilling this request.
exception
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.data.mongodb.CannotGetMongoDbConnectionException: Failed to authenticate to database [lxkdb], username = [tester], password = [p******d]
上面是部分异常的内容,整个异常,如下图:
然后,为什么会有这个异常?
本意我是打算使用spring + springMVC + mongoDB,做个测试项目的。但是配置完成之后,一旦在spring里面加入mongo数据库的配置,那么在启动tomcat服务器的时候,就会出现上图的异常,很是莫名其妙。为什么会这个样子。
使用的spring-data-mongondb整合mongodb。applicationContext-dao.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:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd">
<mongo:repositories base-package="com.lxk.repository" />
<mongo:mongo host="${mongodb.host}" port="${mongodb.port}">
<mongo:options
connections-per-host="${mongo.connectionsPerHost}"
threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"/>
</mongo:mongo>
<mongo:db-factory dbname="${mongodb.name}" username="${mongodb.username}" password="${mongodb.password}" mongo-ref="mongo" />
<!-- 去掉mongodb自动生成的_class字段 -->
<bean id="mappingContext" class="org.springframework.data.mongodb.core.mapping.MongoMappingContext" />
<bean id="defaultMongoTypeMapper" class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper">
<constructor-arg name="typeKey"><null/></constructor-arg>
</bean>
<bean id="mappingMongoConverter" class="org.springframework.data.mongodb.core.convert.MappingMongoConverter">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<constructor-arg name="mappingContext" ref="mappingContext" />
<property name="typeMapper" ref="defaultMongoTypeMapper" />
</bean>
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
<constructor-arg name="mongoConverter" ref="mappingMongoConverter" />
</bean>
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
</beans>
pom.xml里面引用mongodb相关的依赖如下:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>1.5.0.RELEASE</version>
</dependency>
不要在意我读取mongo配置文件的问题,只是这个地方,大家的实现方式各有不同而已,放心,我是可以读取到配置文件的,能报上面的错,也说明这不是问题。
也不可能是用户名或者密码错误,因为我使用romongo,使用相同的用户名和密码,链接数据库是OK的。
然后,问题究竟出在哪里?
最后,发现我自己电脑 上安装的mongo数据库的版本是3.4,算是最新的吧,因为是在一月份的时候,刚刚安装的。而且,也在命令行模式下,开启了mongo数据库的权限限制。就是要对数据库进行操作,首先要进行权限验证。
当时,测试都是OK的。但是现在想使用spring--data-mongondb这个spring工具来操作mongodb,却失败啦。很是郁闷,在网上 查找了各种配置。发现他们的配置方法和我上面的大同小异。没什么不同的。
直接说原因吧:
可以看到上面这个,mongodb和对应的Java driver的对应关系。问题就出现在这个地方,因为上面的那个配置对于比较旧的mongodb是管用的。但是对于升级到3.x之后的mongodb就不管用了。还是不清楚的话,再看下面2张图。
哦,这下问题就算是明朗了,原来是我使用的Java driver的版本太低了。spring-data-mongo的版本在这摆着呢,我在pom里面只是引入了这个jar包的依赖,他会自动 的去下载自己依赖的Java driver包,那就只能升级这个spring-data-mongo咯。但是看下图,
在这,可以看到,spring-data-mongo现在最新的是1.10.1.release。那么再看下图。maven中jar包 依赖关系图。
可以看到,现在就算把这个spring-data-mongo升级到1.10.1版本,他的Java driver的版本才2.14.3,那么这个还是不行的。看下图,这个是在mongodb官网的又一个截图
可以看到,对于mongodb3.4来说,他要求Java driver 的版本必须是3.4的,而且,他的这次升级是不兼容以前2.x的,这就很郁闷了。怎么能这么做生意呢。
好吧,这也不是我说的算的。
这么分析完之后,要解决这个报错的话,就有两种方案。
方案1:抛弃上面xml文件的mongo配置,在找个新的配置方案,就使用最新的3.4版本的mongodb数据库,
方案2:舍弃当前的mongo3.4版本数据库,退回到图上支持的某个版本。
那么,我是先尝试的是方案1,确实想去找一些新的配置方法,来适应这个3.4版本的mongo数据库。但是,网上的mongo配置资料,基本上都是跟我上面xml上的配置差不多的。根本找不到几个可以使用的。没办法。还好我在一月份安装mongo的时候,有记录过。
所以,现在只能去实现plan B 。对,没错,卸载了,mongodb3.4,然后再找个低版本的mongo数据库使用。
因为我有记录,这次卸载和重装mongodb服务倒是很快的。
分分钟就搞定了。找到的mongodb安装是:mongodb-win32-x86_64-2008plus-2.6.7-signed.msi。
链接:http://pan.baidu.com/s/1boODRtl 密码:q2ah
附上某度云盘的链接。
卸载了mongodb,再次安装完之后,再次,设置权限,创建root数据库管理用户和普通数据库用户。
再次安装请参考:详细图解mongodb 3.4.1 win7x64下载、安装、配置与使用2017/01/16
再次设置权限和创建不同权限用户请参考:mongodb authentication 设置权限之后,新建个管理账户和一般数据库用户,在win 7 64bit 环境下测试使用实例
在,上面的这些,都搞定之后,那么,再次启动刚刚的那个spring + springMVC +mongodb,之后,就完美的解决了刚刚报错的问题啦。
为什么我要这么配置呢?具体为什么这么配置,还有没有更好的配置方案,我目前是不清楚了。但是这么配置之后,使用mongo数据库,那是相当的舒爽的。具体怎么个舒爽法,看下面的使用,你就知道啦。
首先是要在mongo数据库中生成对应collection,也就是生成一个表结构啦。直接如下:
@Document(collection = "student")
public class Student implements Serializable {
@Id
private String id;
private String name;
private int age;
private boolean sex;
}
就这么简单,只需要添加上@document,之后,他就可以在你保存数据到数据库的时候,自动生成一张表。不像MySQL啥的,还得自己写个insert语句,渣渣。有了框架还得自己拼sql语句,那只能说框架还是不够机智。还得一个java文件一个xml文件配对使用操作数据库。很是厌恶这种方式,虽然我不知道现在有没有变化,或许这个操作方式,是以前的啦。那就算是我勿喷了。
然后再看如何使用数据库的crud。
这个也简单,保存或者更新都可以使用save()方法。查询的时候,可以使用@query注解,而不是好多人写的,自己先定义个接口,再自己去实现,还得自己调用工厂方法,得到个mongo实例,在封装数据,哎哟,麻烦死了。自己写那么多重复代码,自己不嫌弃啰嗦吗。
@Repository("studentRepository")
public interface StudentRepository extends MongoRepository<Student, String> {
@Query("{'id':?0}")
Student findById(String id);
@Query("{'name':?0}")
List<Student> findByName(String name);
}
就这么简单,你只需要传入简单的参数,就可以从mongo数据库查询你想要的结果。多么简单。方便。再看看别人写的crud。我真看不下去,太长了,太啰嗦了。
而且,这个写法,跟你在使用mongo数据库的可视化工具,比如mongoVUE或者romongo一样,使用的语句差不多。
这个还是可以扩展的,自定义接口。啥的,后话了。
在仔细分析了这个错误之后,湿胸我学到 了什么?
不要对于一些事情,以“不就是。。。。”的态度。我的这个问题的出现以及如何解决,就充分说明了这个问题,在你没动手去做之前,大可以说:“不就是一个jdbc吗,那不是分分钟的事吗!”,但是你要是真的动手去做某一件事的时候,你就发现,说是一回事,做,就是另外一回事啦。