mongodb-java 3.x版本,有用户名密码时提示“XXXX(一个加密算法)is not available”的解决方案

今天写代码,满满的都是坑啊。。特此记录一下。

首先说明一下项目环境:Maven + mongodb-java-driver-3.2.2

原来的项目是用mongo 2.x的驱动写的,然后把它升级到3.x。首先有一个很大的变动就是用户名和密码验证这块。

这是获取MongoClient的方法。


import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;

/**
 * MongoDBUtils
 * @author administration
 *
 */
public class DBUtil {

	/**
	 * 有用户名密码的方式连接mongoDB(MongoCredential方式)
	 * @param mongodbAddr
	 * @param databaseName
	 * @return
	 */
	public static MongoClient getMongoClientByCredent(String mongodbAddr, String databaseName){
		MongoClient mongoClient;
		Properties p = TDTFile.getProperAddr("db.properties");
		String user = p.getProperty("username");
		String pswd = p.getProperty("password");
		List<ServerAddress> serverAddrList = new ArrayList<ServerAddress>();
		ServerAddress serverAddress = new ServerAddress(mongodbAddr);
		serverAddrList.add(serverAddress);
		List<MongoCredential> credentialList = new ArrayList<MongoCredential>();
		MongoCredential credential = MongoCredential.createCredential(user, databaseName, pswd.toCharArray());
		credentialList.add(credential);
		mongoClient = new MongoClient(serverAddrList, credentialList);
		return mongoClient;
	}
	
	/**
	 * 有用户名密码的方式连接mongoDB(URI方式)
	 * @param mongodbAddr
	 * @param databaseName
	 * @return
	 */
	public static MongoClient getMongoClientByURI(String mongodbAddr, String databaseName){
		MongoClient mongoClient;
		Properties p = TDTFile.getProperAddr("db.properties");
		String user = p.getProperty("username");
		String pswd = p.getProperty("password");
		//System.out.println(user + "," + pswd);
		String uri = String.format("mongodb://%s:%s@%s/%s", user, pswd, mongodbAddr, databaseName);
		System.out.println(uri);
		MongoClientURI mongoClientURI = new MongoClientURI(uri);
		mongoClient = new MongoClient(mongoClientURI);
		return mongoClient;
	}
	
}
两种方式都没问题,在eclipse下跑的好好的。但是!!用mvn package打包之后就不能用了,经过一晚上家一白天的分析之后,我把错误的根源锁定在了命令行执行命令的语句上。我的语句是这样的:

java -Djava.ext.dirs=../lib 其他参数


问题就出在这个-D参数,百度得知,-D是设置了相当于外部的环境变量的意思,由于我的main方法要依赖许多第三方jar包,这看起来也没什么错。但是却忽略了一个问题,就是 使用-D参数指定其他目录后,java本来需要加载的%JAVA_HOME%\jre\lib\ext\目录下的jar包就不在加载了!!在网上搜了半天-D参数的用法,居然没有人提到过这一点。。可是给我坑苦了。一天的时间就浪费在这里。。


解决方案:

将需要的外部依赖包,包括jdk自带的一些加密算法之类的包,一起用maven打包到lib下。问题解决。顺便说一下,mongodb3.x需要的算法包是:%JAVA_HOME%\jre\lib\ext\sunjce_provider.jar




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值