我们在之前的文章中已经学习了如何在Spring Boot中连接MongoDB数据库。
Spring Boot中使用MongoDB数据库
实际项目中我们可能需要连接多个MongoDB数据源,比如用户库user,日志库log。本章我们来记录连接多个数据源的步骤,以两个数据源为例,多个数据源类推。

数据源配置文件配置两个数据源

我们之前的配置是配置在application.properties文件中。
对配置文件不了解的可以参考
spring boot配置文件和修改端口
新增两个数据源如下:

spring.data.mongodb.user.database=db_user
spring.data.mongodb.user.host=192.168.30.249
spring.data.mongodb.user.port=28719
#spring.data.mongodb.user.username=username
#spring.data.mongodb.user.password=passwordspring.data.mongodb.log.database=db_log
spring.data.mongodb.log.host=192.168.30.249
spring.data.mongodb.log.port=28719
#spring.data.mongodb.log.username=username
#spring.data.mongodb.log.password=password

新建一个基础的抽象类

AbstractMongoConfigure.java
内容如下:

package com.biologic.util;import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoDbFactory;import com.mongodb.MongoClient;public abstract class AbstractMongoConfig {// 变量名跟配置的参数对应private String host, database, username, password;private int port;public String getHost() {return host;}public void setHost(String host) {this.host = host;}public String getDatabase() {return database;}public void setDatabase(String database) {this.database = database;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getPort() {return port;}public void setPort(int port) {this.port = port;}public MongoDbFactory mongoDbFactory() throws Exception {// 无认证的初始化方法return new SimpleMongoDbFactory(new MongoClient(host, port), database);// 有认证的初始化方法// ServerAddress serverAddress = new ServerAddress(host, port);// List<MongoCredential> mongoCredentialList = new ArrayList<>();// mongoCredentialList.add(MongoCredential.createCredential(username, database,// password.toCharArray()));// return new SimpleMongoDbFactory(new MongoClient(serverAddress,// mongoCredentialList), database);}/** Factory method to create the MongoTemplate*/abstract public MongoTemplate getMongoTemplate() throws Exception;}

或者


public abstract class AbstractMongoConfig {private String uri;
/** Method that creates MongoDbFactory Common to both of the MongoDb* connections*/public MongoDbFactory mongoDbFactory() throws Exception {return new SimpleMongoDbFactory(new MongoClientURI(uri);}/** Factory method to create the MongoTemplate*/abstract public MongoTemplate getMongoTemplate() throws Exception;

数据源加载

数据源加载需要新建继承AbstractMongoConfigure的加载类,有多少个数据源就需要新建多少个数据源加载类。
我们这里需要新建两个数据源加载类

新建用户数据源加载类

UserMongoConfig.java

package com.biologic.util;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.core.MongoTemplate;//prefix需要与配置文件中用户user数据源的配置前缀对应
@Configuration
@ConfigurationProperties(prefix = "spring.data.mongodb.user")
public class UserMongoConfig extends AbstractMongoConfig {     @Primary@Bean(name = "mongoTemplate")@Overridepublic  MongoTemplate getMongoTemplate() throws Exception {        return new MongoTemplate(mongoDbFactory());    }}

新建日志数据源加载类

package com.biologic.util;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoTemplate;//prefix需要与配置文件中日志log数据源的配置前缀对应
@Configuration
@ConfigurationProperties(prefix = "spring.data.mongodb.log")
public class LogMongoConfig extends AbstractMongoConfig {     @Override   @Bean(name = "logMongoTemplate")public  MongoTemplate getMongoTemplate() throws Exception {        return new MongoTemplate(mongoDbFactory());    }}

需要注意的是 多个数据源中有一个需要设置bean名为mongoTemplate,而且注释为@Primary,否则WebMvcConfigurationSupport.class等会报错找不到mongoTemplate。

排除mongo的自动注入

有一点需要特别注意的是Spring Boot会自动注入mongoTemplate,与我们设置的多个数据源有冲突。为了防止默认注入,需要排除自动注入的类。
找到Spring Boot的启动类Applocation.java在@SpringBootApplication后面新增排除类如下:

@SpringBootApplication(exclude = {MongoAutoConfiguration.class,MongoDataAutoConfiguration.class,MongoDbAutoConfiguration.class})

完整的Applocation.java如下:

package com.biologic;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration;
import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;import com.mofang.microservice.support.boot.feign.FeignDefaultContractConfiguration;
import com.mofang.microservice.support.boot.mongodb.MongoDbAutoConfiguration;@SpringBootApplication(exclude = {MongoAutoConfiguration.class,MongoDataAutoConfiguration.class,MongoDbAutoConfiguration.class})
@EnableDiscoveryClient
public class Applocation {public static void main(String[] args) throws Exception {SpringApplication.run(Applocation.class, args);}}

使用多个数据源

使用时,直接指明对应注入即可,如下:

package com.biologic.api;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import com.biologic.api.service.QualityCheckRepository;
import com.biologic.entity.QualityCheck;@Controller
@RequestMapping(path = "/demo")
public class QualityCheckController {@Autowired@Qualifier(value = "mongoTemplate")MongoTemplate mongoTemplate;@Autowired@Qualifier(value = "logMongoTemplate")MongoTemplate logMongoTemplate;@GetMapping(path = "/qualityCheck")public @ResponseBody String qualityCheck() {PrepareReportPool repareReportPool = new PrepareReportPool();repareReportPool.setBarcodes(okBarCodes);repareReportPool.setChangeStateTaskId(autoQualityCheckLog.getId());repareReportPool.setCreateTime(new Date());mongoTemplate.save(repareReportPool);AutoQualityCheckLog autoQualityCheckLog = new AutoQualityCheckLog();autoQualityCheckLog.setId(UUID.randomUUID().toString());autoQualityCheckLog.setCheckTime(new Date());autoQualityCheckLog.setAbnormalBarcodes(abnormalBarCodes);autoQualityCheckLog.setFailBarcodes(failbarcodeList);autoQualityCheckLog.setPassBarcodes(okBarCodes);autoQualityCheckLog.setNoDpBarcodes(noDpBarcodes);autoQualityCheckLog.setStateAbnormalDp(stateAbnormalDp);autoQualityCheckLog.setOkStateChangeBarcodes(okStateChangeBarcodes);autoQualityCheckLog.setFailStateChangeBarcodes(failStateChangeBarcodes);logMongoTemplate.save(autoQualityCheckLog);return "ok";}}

可能遇到的问题-MongoClient’ that could not be found

详细报错如下:

***************************
APPLICATION FAILED TO START
***************************Description:Parameter 0 of method mongoDbFactory in org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration required a bean of type 'com.mongodb.MongoClient' that could not be found.- Bean method 'mongo' not loaded because auto-configuration 'MongoAutoConfiguration' was excludedAction:Consider revisiting the conditions above or defining a bean of type 'com.mongodb.MongoClient' in your configuration.

原因
重写了MongoClient等之后导致原来的自动注入缺少bean

解决方式
主要是看哪个自动注入的类在引用默认的MongoClient,把它排除出去即可,例如:

@SpringBootApplication(exclude = {MongoAutoConfiguration.class,MongoDataAutoConfiguration.class,MongoDbAutoConfiguration.class})

可能遇到的问题-more than one ‘primary’ bean found among candidates

详细报错如下:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sampleController': Unsatisfied dependency expressed through field 'mongoTemplate'; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.data.mongodb.core.MongoTemplate' available: more than one 'primary' bean found among candidates: [logMongoTemplate, userMongoTemplate, mongoTemplate]at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE]at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE]at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151) [spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]at com.biologic.Applocation.main(Applocation.java:18) [classes/:na]
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.springframework.data.mongodb.core.MongoTemplate' available: more than one 'primary' bean found among candidates: [logMongoTemplate, userMongoTemplate, mongoTemplate]at org.springframework.beans.factory.support.DefaultListableBeanFactory.determinePrimaryCandidate(DefaultListableBeanFactory.java:1365) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]at org.springframework.beans.factory.support.DefaultListableBeanFactory.determineAutowireCandidate(DefaultListableBeanFactory.java:1326) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1113) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]

原因
Spring Boot会自动注入一个默认的mongoTemplate或者我们设置了多个@Primary数据源。

解决方式
排除Spring Boot自动注入的类,我们自动重写的mongoTemplate需要且只能设置一个为@Primary。
参考

@SpringBootApplication(exclude = {MongoAutoConfiguration.class,MongoDataAutoConfiguration.class,MongoDbAutoConfiguration.class})

和数据源加载小节,一个数据源注释@Primary,另一个不能含有该注释。

Spring Boot配置MongoDB多数据源相关推荐

  1. java多个数据库数据进行访问_通过Spring Boot配置动态数据源访问多个数据库的实现代码...

    之前写过一篇博客<Spring+Mybatis+Mysql搭建分布式数据库访问框架>描述如何通过Spring+Mybatis配置动态数据源访问多个数据库.但是之前的方案有一些限制(原博客中 ...

  2. 13、Spring Boot 2.x 多数据源配置

    1.13 Spring Boot 2.x 多数据源配置 完整源码: Spring-Boot-Demos 转载于:https://www.cnblogs.com/Grand-Jon/p/9999779. ...

  3. mysql 多数据源访问_通过Spring Boot配置动态数据源访问多个数据库的实现代码

    之前写过一篇博客<Spring+Mybatis+Mysql搭建分布式数据库访问框架>描述如何通过Spring+Mybatis配置动态数据源访问多个数据库.但是之前的方案有一些限制(原博客中 ...

  4. boot jndi数据源 spring_使用Spring Boot配置JNDI数据源 -Roy教程

    在这篇文章中,我们将看到如何使用Spring Boot配置JNDI数据源.JNDI数据源与JDBC数据源非常相似.JNDI数据源访问在应用程序服务器中预定义和配置并作为JNDI资源或服务发布的数据库连 ...

  5. (转)Spring Boot(十一):Spring Boot 中 MongoDB 的使用

    http://www.ityouknow.com/springboot/2017/05/08/spring-boot-mongodb.html MongoDB 是最早热门非关系数据库的之一,使用也比较 ...

  6. Spring Boot:MongoDB的使用

    一.MongoDB 简介 MongoDB(来自于英文单词"Humongous",中文含义为"庞大")是可以应用于各种规模的企业.各个行业以及各类应用程序的开源数 ...

  7. spring boot配置详情

    spring boot配置详情如下:  1.MVC相关  mvc  spring.mvc.async.request-timeout设定async请求的超时时间,以毫秒为单位,如果没有设置的话,以具体 ...

  8. 6.3 Spring Boot集成mongodb开发

    6.3 Spring Boot集成mongodb开发 本章我们通过SpringBoot集成mongodb,Java,Kotlin开发一个极简社区文章博客系统. 0 mongodb简介 Mongo 的主 ...

  9. MongoDB最简单的入门教程之四:使用Spring Boot操作MongoDB

    Spring Boot 是一个轻量级框架,可以完成基于 Spring 的应用程序的大部分配置工作.Spring Boot的目的是提供一组工具,以便快速构建容易配置的Spring应用程序,省去大量传统S ...

  10. spring boot配置druid(德鲁伊)

    spring boot配置druid(德鲁伊) 关于druid的介绍请看 阿里巴巴温少访谈 1.引入相关依赖,全部依赖是上一篇spring boot+mybatis依赖的基础上,再加上下边的依赖,如下 ...

最新文章

  1. OSPF的route-id选举
  2. html5 长链接,Vue通过WebSocket建立长连接,连接
  3. 数据库分区分表以及读写分离
  4. Python+MySQL学习笔记(一)
  5. 20142335郝昊第三周学习总结
  6. 不同语言,系统通过共享内存方式实现信息交互
  7. git pull ---rebase
  8. 利用windows 2003实现服务器群集的搭建与架设(二)
  9. BZOJ1076[SCOI2008] 奖励关
  10. 求立方体的体积、表面积(c++)
  11. 《统计数据会说谎》阅读总结
  12. 斐波那契 (黄金分割法)查找——推导 详细
  13. 网络广告效果的评估方法
  14. BF算法(暴力算法)
  15. 黑苹果 10G 网卡(intel Aquantia)解决方案及big sur 11.x 下驱动方式
  16. 华为过程可信cib是指_华为流程规范考.doc
  17. uIP resolv_found的实现
  18. Visual Studio和VS Code的区别
  19. C++/MFC-几种常用控件
  20. 2021年职场百态:半数互联网人被迫内卷下,年轻人开始青睐“铁饭碗”

热门文章

  1. 页面埋点H5 大数据uniapp 按需要更改代码就行
  2. 攻防世界 Web高手进阶区 mfw
  3. DAOS 源码解析之 daos_array
  4. Android Debug Bridge(安卓调试桥) tools
  5. PolSAR处理极化SAR
  6. 计算机专业的优秀学长寄语大一新生,学长学姐对大一新生的寄语 大学学长学姐寄语励志...
  7. handler图片自动切换+listview+GridView+侧滑菜单+fragment
  8. iphone html 手机震动,iPhone来电不会震动怎么回事?简单几招排查技巧
  9. matlab差值后求斜率,用三次样条插值求离散点斜率 matlab程序
  10. The APR based Apache Tomcat Native library which allows optimal performance in......