SpringBoot配置MongoDB多数据源的方法步骤
1、项目构建
添加pom文件
org.springframework.boot spring-boot-starter-data-mongodb
2、在application.properties中添加配置
##startmongodbforbasic #---------------------------------------------- basic.spring.data.mongodb.host=localhost basic.spring.data.mongodb.port=27016 basic.spring.data.mongodb.username=auto_compute basic.spring.data.mongodb.password=vqOqSZRs basic.spring.data.mongodb.database=auto_compute #---------------------------------------------- ##endmongodbforspirit ##startmongodbforauth #---------------------------------------------- auth.spring.data.mongodb.host=localhost auth.spring.data.mongodb.port=27016 auth.spring.data.mongodb.username=datacenter auth.spring.data.mongodb.password=Bds6NadsfafGlV auth.spring.data.mongodb.database=datacenter #---------------------------------------------- ##endmongodbforspirit
3、配置相应的数据源
采用mongoTemplate进行mongo的相关操作,写一个基础的抽象类
importcom.mongodb.MongoClient; importcom.mongodb.MongoCredential; importcom.mongodb.ServerAddress; importlombok.Getter; importlombok.Setter; importorg.springframework.data.mongodb.MongoDbFactory; importorg.springframework.data.mongodb.core.MongoTemplate; importorg.springframework.data.mongodb.core.SimpleMongoDbFactory; importjava.util.ArrayList; importjava.util.List; @Getter @Setter publicabstractclassAbstractMongoConfigure{ privateStringhost; privateintport; privateStringusername; privateStringpassword; privateStringdatabase; publicMongoDbFactorymongoDbFactory()throwsException{ /*//无认证的初始化方法 returnnewSimpleMongoDbFactory(newMongoClient(host,port),database);*/ //有认证的初始化方法 ServerAddressserverAddress=newServerAddress(host,port); ListmongoCredentialList=newArrayList<>(); MongoCredentialmongoCredential=MongoCredential.createCredential(username,database,password.toCharArray()); mongoCredentialList.add(mongoCredential); returnnewSimpleMongoDbFactory(newMongoClient(serverAddress,mongoCredentialList),database); } abstractpublicMongoTemplategetMongoTemplate()throwsException; }
数据源加载需要继承AbstractMongoConfigure抽象类,有多少个数据源就需要新建多少个数据源加载类
3.1、第一个数据源
importorg.springframework.boot.context.properties.ConfigurationProperties; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; importorg.springframework.context.annotation.Primary; importorg.springframework.data.mongodb.core.MongoTemplate; importorg.springframework.data.mongodb.repository.config.EnableMongoRepositories; @Configuration @EnableMongoRepositories(basePackages={"com.tcl.dc.autodata.dao.base"},mongoTemplateRef="mongoTemplate") @ConfigurationProperties(prefix="basic.spring.data.mongodb") publicclassBasicMongoConfigextendsAbstractMongoConfigure{ @Primary @Bean(name="mongoTemplate") @Override publicMongoTemplategetMongoTemplate()throwsException{ returnnewMongoTemplate(mongoDbFactory()); } }
其中basePackages的值用于相应的基础包,prefix为application.properties中的配置值
3.2、第二个数据源
importorg.springframework.boot.context.properties.ConfigurationProperties; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Configuration; importorg.springframework.data.mongodb.core.MongoTemplate; importorg.springframework.data.mongodb.repository.config.EnableMongoRepositories; @Configuration @EnableMongoRepositories(basePackages={"com.tcl.dc.autodata.dao.auth"},mongoTemplateRef="authMongoTemplate") @ConfigurationProperties(prefix="auth.spring.data.mongodb") publicclassAuthMongoConfigextendsAbstractMongoConfigure{ @Bean(name="authMongoTemplate") @Override publicMongoTemplategetMongoTemplate()throwsException{ returnnewMongoTemplate(mongoDbFactory()); } }
4、注意
1、多个数据源中有一个bean需要设置为mongoTemplate,且必须添加@Primary注解,否则WebMvcConfigurationSupport.class等会报错找不到mongoTemplate
2、SpringBoot会自动注入mongoTemplate,与我们配置的多个数据源有冲突。为了防止默认注入,需要排除自动注入的类。在SpringBoot的启动类Applocation.java添加排除类注解
@SpringBootApplication(exclude={ MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
5、使用多个数据源
使用时,直接对应注入即可
@Autowired @Qualifier(value="mongoTemplate") MongoTemplatemongoTemplate; @Autowired @Qualifier(value="authMongoTemplate") MongoTemplateauthMongoTemplate;
6、可能遇到的问题
1、'com.mongodb.MongoClient'thatcouldnotbefound
详细报错如下:
***************************
APPLICATIONFAILEDTOSTART
***************************Description:
Parameter0ofmethodmongoDbFactoryinorg.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfigurationrequiredabeanoftype'com.mongodb.MongoClient'thatcouldnotbefound.
-Beanmethod'mongo'notloadedbecauseauto-configuration'MongoAutoConfiguration'wasexcluded
Action:Considerrevisitingtheconditionsaboveordefiningabeanoftype'com.mongodb.MongoClient'inyourconfiguration.
原因:重写了MongoClient等之后导致原来的自动注入缺少bean
解决方式:主要是看哪个自动注入的类在引用默认的MongoClient,把它排除出去即可,例如:
@SpringBootApplication(exclude={ MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
2、morethanone‘primary'beanfoundamongcandidates
详细报错如下:
org.springframework.beans.factory.UnsatisfiedDependencyException:Errorcreatingbeanwithname'sampleController':Unsatisfieddependencyexpressedthroughfield'mongoTemplate';nestedexceptionisorg.springframework.beans.factory.NoUniqueBeanDefinitionException:Noqualifyingbeanoftype'org.springframework.data.mongodb.core.MongoTemplate'available:morethanone'primary'beanfoundamongcandidates:[logMongoTemplate,userMongoTemplate,mongoTemplate]
atorg.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588)~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
atorg.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
atorg.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
atorg.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
atorg.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
atorg.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
atorg.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
atorg.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
atorg.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE]
atorg.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)~[spring-context-4.3.7.RELEASE.jar:4.3.7.RELEASE]
atorg.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)~[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
atorg.springframework.boot.SpringApplication.refresh(SpringApplication.java:737)[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
atorg.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370)[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
atorg.springframework.boot.SpringApplication.run(SpringApplication.java:314)[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
atorg.springframework.boot.SpringApplication.run(SpringApplication.java:1162)[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
atorg.springframework.boot.SpringApplication.run(SpringApplication.java:1151)[spring-boot-1.5.2.RELEASE.jar:1.5.2.RELEASE]
atcom.biologic.Applocation.main(Applocation.java:18)[classes/:na]
Causedby:org.springframework.beans.factory.NoUniqueBeanDefinitionException:Noqualifyingbeanoftype'org.springframework.data.mongodb.core.MongoTemplate'available:morethanone'primary'beanfoundamongcandidates:[logMongoTemplate,userMongoTemplate,mongoTemplate]
atorg.springframework.beans.factory.support.DefaultListableBeanFactory.determinePrimaryCandidate(DefaultListableBeanFactory.java:1365)~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
atorg.springframework.beans.factory.support.DefaultListableBeanFactory.determineAutowireCandidate(DefaultListableBeanFactory.java:1326)~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
atorg.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1113)~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
atorg.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
atorg.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)~[spring-beans-4.3.7.RELEASE.jar:4.3.7.RELEASE]
原因:SpringBoot会自动注入一个默认的mongoTemplate或者设置了多个@Primary数据源
解决方式:排除SpringBoot自动注入的类,自动重写的mongoTemplate需要且只能设置一个为@Primary
到此这篇关于SpringBoot配置MongoDB多数据源的方法步骤的文章就介绍到这了,更多相关SpringBootMongoDB多数据源内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。