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吗,那不是分分钟的事吗!”,但是你要是真的动手去做某一件事的时候,你就发现,说是一回事,做,就是另外一回事啦。



发布评论
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Java springmvc web项目,基于maven的hello world入门级项目使用IntelliJ IDEA 2017版本知识解答
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。