MongoDB SpringMVC整合mongodb 3.0驱动的异常解决

来源:互联网 发布:java 连接池实现原理 编辑:程序博客网 时间:2024/06/13 06:11
MongoDB springMVC整合mongodb 3.0驱动的异常解决



因为业务原因新整合了 mongo 驱动3.0,使用mongoDB的高级查询。并编写了MongoDBUtil工具类。如图为驱动包的maven依赖。

<!-- mongodb java driver --><dependency>   <groupId>org.mongodb</groupId>   <artifactId>mongo-java-driver</artifactId>   <version>3.0.2</version></dependency><!-- Spring data mongodb --><dependency>   <groupId>org.springframework.data</groupId>   <artifactId>spring-data-mongodb</artifactId>   <version>1.8.0.RELEASE</version></dependency>



MongoDBUtil工具类

package com.xunxin.service.app.user;import java.util.ArrayList;import java.util.List;import java.util.Map;import org.bson.Document;import com.mongodb.BasicDBObject;import com.mongodb.MongoClient;import com.mongodb.MongoCredential;import com.mongodb.MongoException;import com.mongodb.ServerAddress;import com.mongodb.client.FindIterable;import com.mongodb.client.MongoCollection;import com.mongodb.client.MongoDatabase;import com.xunxin.vo.user.UserEntity;/** * Copyright © 2017 noseparte(Libra) © Like the wind, like rain * @Author Noseparte * @Compile 2017年11月29日 -- 下午4:22:47 * @Version 1.0 * @DescriptionMongoDB 驱动3.0工具类 */public final class MongoDBUtil {private static MongoClient mongoClient = null;private static MongoDatabase database = null;private static ServerAddress serverAddress = null;private static MongoCredential credentials = null;private static List<ServerAddress> addressLists = new ArrayList<ServerAddress>();private static List<MongoCredential> credentialsLists = new ArrayList<MongoCredential>();private static final String IP = "192.168.1.105";private static final int PORT = 10001;public static void init() {try {serverAddress = new ServerAddress(IP, PORT);addressLists.add(serverAddress);// credentials = MongoCredential.createMongoCRCredential("test1", "test",// "test1".toCharArray());// credentialsLists.add(credentials);// mongoClient = new MongoClient(addressLists, credentialsLists);mongoClient = new MongoClient(addressLists);} catch (MongoException e) {System.out.println(e.toString());}if (null != mongoClient) {database = mongoClient.getDatabase("test");}}public static MongoClient getMongoClient() {if (null == mongoClient) {init();}return mongoClient;}/** * 获取database *  * @return */public static MongoDatabase getDatabase() {if (null == mongoClient) {init();}return database;}/** * 获取User Collection *  * @return */public static MongoCollection<Document> getUserCollection() {if (null == database) {database = getDatabase();}if (null != database) {return database.getCollection("data");}return null;}/** * 删除所有用户 */public static void deleteAllUsers() {System.out.println("删除User Collection中所有数据...");MongoCollection<Document> collection = getUserCollection();FindIterable<Document> cursor = collection.find();while (cursor.iterator().hasNext()) {collection.deleteOne(cursor.iterator().next());}System.out.println("====================================");}/** * 查询所有用户 */public static void queryAllUsers() {System.out.println("查询User Collection中所有数据:");MongoCollection<Document> collection = getUserCollection();// 方法一/* * MongoCursor<Document> cur = collection.find().iterator(); try{ while * (cur.hasNext()) { System.out.println(cur.next().toJson()); } }catch(Exception * e){ System.out.println(e.getMessage()+e); }finally { cur.close(); } */// 方法二for (Document cursor : collection.find()) {System.out.println(cursor.toJson());}System.out.println("================================================================");}/** * 保存用户信息 *  * @param user */public static void saveUser(UserEntity user) {System.out.println("保存用户信息:" + user.toString());MongoCollection<Document> userCollection = getUserCollection();//userCollection.insertOne(user.toBasicDBObject());System.out.println("================================================================");}/** * 更新用户信息 *  * @param user *///public static void update(User user) {//System.out.println("更新用户信息:" + user.toString());//MongoCollection<Document> userCollection = getUserCollection();//userCollection.updateMany(new Document().append("name", user.getName()), user.toBasicDBObject());//System.out.println("================================================================");//}/** * 增加用户更新次数 *  * @param userName *            用户名 */public static void incUserUpdateTimes(String userName) {MongoCollection<Document> userCollection = getUserCollection();BasicDBObject newDocument = new BasicDBObject().append("$inc", new BasicDBObject().append("updateTimes", 1));userCollection.updateOne(new BasicDBObject().append("name", userName), newDocument);}/** * 更新用户名 *  * @param oldName *            旧用户名 * @param newName *            新用户名 */public static void updateUserName(String oldName, String newName) {MongoCollection<Document> userCollection = getUserCollection();BasicDBObject newDocument = new BasicDBObject().append("$set", new BasicDBObject().append("name", newName));userCollection.updateOne(new BasicDBObject().append("name", oldName), newDocument);}/** * 更新User Age *  * @param userName *            用户名 * @param age *            Age */public static void updateUserAge(String userName, int age) {MongoCollection<Document> userCollection = getUserCollection();BasicDBObject newDocument = new BasicDBObject().append("$set", new BasicDBObject().append("age", age));userCollection.updateOne(new BasicDBObject().append("name", userName), newDocument);}//public static User queryUserByName(String userName) {//MongoCollection<Document> userCollection = getUserCollection();//BasicDBObject query = new BasicDBObject();//query.put("name", userName);//User user = null;//for (Document cursor : userCollection.find(query)) {//System.out.println(cursor.toJson());//Map<String, Object> userMap = (Map<String, Object>) cursor;////user = new User();//user.setName(String.valueOf(userMap.get("name")));//user.setAge(Integer.valueOf(String.valueOf(userMap.get("age"))));//user.setUpdateTimes(Integer.valueOf(String.valueOf(userMap.get("updateTimes"))));////System.out.println(user.toString());//}///*// * MongoCursor<Document> cursor = userCollection.find(query).iterator();// * while(cursor.hasNext()) { Document document = cursor.next();// * // * Map<String, Object> userMap = (Map<String, Object>) document;// * // * user = new User(); user.setName(String.valueOf(userMap.get("name")));// * user.setAge(Integer.valueOf(String.valueOf(userMap.get("age"))));// * user.setUpdateTimes(Integer.valueOf(String.valueOf(userMap.get("updateTimes")// * )));// * // * System.out.println(user.toString()); }// */////return user;//}public static void queryUserByAge(List<Integer> ageList) {MongoCollection<Document> userCollection = getUserCollection();BasicDBObject query = new BasicDBObject();query.put("age", new BasicDBObject("$in", ageList));FindIterable<Document> cursor = userCollection.find(query);while (cursor.iterator().hasNext()) {System.out.println(cursor.iterator().next());}}public static void queryUserByGreatThanAge(int age) {MongoCollection<Document> userCollection = getUserCollection();BasicDBObject query = new BasicDBObject();query.put("age", new BasicDBObject("$gt", age));FindIterable<Document> cursor = userCollection.find(query);while (cursor.iterator().hasNext()) {System.out.println(cursor.iterator().next());}}public static void queryUserByLessThanAge(int age) {MongoCollection<Document> userCollection = getUserCollection();BasicDBObject query = new BasicDBObject();query.put("age", new BasicDBObject("$lt", age));FindIterable<Document> cursor = userCollection.find(query);while (cursor.iterator().hasNext()) {System.out.println(cursor.iterator().next());}}public static void queryUserNotEquireAge(int age) {MongoCollection<Document> userCollection = getUserCollection();BasicDBObject query = new BasicDBObject();query.put("age", new BasicDBObject("$ne", age));FindIterable<Document> cursor = userCollection.find(query);while (cursor.iterator().hasNext()) {System.out.println(cursor.iterator().next());}}public static void deleteUserByName(String userName) {MongoCollection<Document> userCollection = getUserCollection();BasicDBObject document = new BasicDBObject();document.put("name", userName);userCollection.deleteMany(document);}public static void deleteUserByNameList(List<String> nameList) {MongoCollection<Document> userCollection = getUserCollection();BasicDBObject query = new BasicDBObject();query.put("name", new BasicDBObject("$in", nameList));userCollection.deleteMany(query);}public static void setDatabase(MongoDatabase database) {MongoDBUtil.database = database;}}



启动项目时候出现如下错误:

java.lang.NoSuchFieldError: autoConnectRetry

刚开始mongo部分的service注入失败,误以为是jar包冲突。重新加载本地maven仓库,依然报如上错误。


仔细研究console的bug信息之后发现下面的错误信息:

Usage of 'mongo-options' is no longer supported for MongoDB Java driver version 3 and above. Please use 'mongo-client-options' and refer to chapter 'MongoDB 3.0 Support' for details

翻译过来就是说使用mongo 3.0驱动之后要将<mongo:mongo改成<mongo:mongo-client对应的

<mongo:options改成<mongo:client-options,还没有结束。






接下来会接着报错 不允许出现属性'auto-connect-retry''slave-ok' 之类的提示

org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 33 in XML document from class

path resource [application-config.xml] is invalid; nested exception is org.xml.sax.SAXParseException; lineNumber:

33; columnNumber: 25; cvc-complex-type.3.2.2: 元素 'mongo:client-options' 中不允许出现属性 'auto-connect-

retry'。


最终的代码,项目正常运行。

<!-- <mongo:mongo host="127.0.0.1" port="27017"> --><mongo:mongo-client host="192.168.1.105" port="10001"><mongo:client-options connections-per-host="10"threads-allowed-to-block-for-connection-multiplier="5"connect-timeout="10000" socket-keep-alive="false" ></mongo:client-options></mongo:mongo-client>





About Me:

    Github地址:https://github.com/noseparte 
    Email:  noseparte@aliyun.com     有java与hadoop相关的技术问题,可以发私信与我交流。
     NPM地址:  https://www.npmjs.com/~noseparte
    WebSite: http://www.noseparte.com/   Copyright © 2017 noseparte






原创粉丝点击