如何在springboot中如何配置多個mongodb數(shù)據(jù)源,在新版本的spring-data-mongodb-3.0.2 中已經(jīng)不再支持網(wǎng)絡(luò)上的大部分的示例了,如:基于 SimpleMongoDbFactory 的這種方已經(jīng)被廢棄刪除了,應(yīng)改用SimpleMongoClientDatabaseFactory 方式,經(jīng)過一天的研究終于總結(jié)出了最新的配置方式供大家參考:
步驟如下:
導(dǎo)入依賴:
<!-- spring-boot 版本 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/>
</parent>
<!-- spring-boot data mongodb 依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<!-- spring-boot web 依賴 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
1.在yaml 文件中 配置兩個以上mongo 集群數(shù)據(jù)源
spring:
data:
mongodb:
mpc:
uri: mongodb://用戶名:密碼@ip:port,ip:port/database
saas:
uri: mongodb://用戶名:密碼@ip:port,ip:port/database
2.排除springboot默認(rèn)的mongo初始化機(jī)制
@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
public class MpcExampleApplication {
public static void main(String[] args) {
SpringApplication.run(MpcExampleApplication.class, args);
}
}
3.生成多個MongoTemplate 并開啟Repositor 操作并指定作用于哪個package
創(chuàng)建mongoSaasTemplate作用于"com.sun.mpc.example.storage.mongorpst.mpc" 下的Repository
/**
* 初始化mcp mongoMpcTemplate
* 如果不是多mongo數(shù)據(jù)源無需引入該配置
* 注:開啟多數(shù)據(jù)源配置需要排除springboot默認(rèn)的mongo初始化機(jī)制
* @SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
* @author liangjian
* @date
*/
@Slf4j
@Configuration
@EnableMongoRepositories(basePackages = "com.sun.mpc.example.storage.mongorpst.mpc", mongoTemplateRef = "mongoMpcTemplate")
public class MongoMpcTemplateConfig {
@Value("${spring.data.mongodb.mpc.uri}")
private String uri;
@Primary
@Bean(name = "mongoMpcTemplate")
public MongoTemplate mongoMpcTemplate() throws Exception {
log.info("-----------------------init mongoMpcTemplate success-----------------------------------");
return new MongoTemplate(mongoMpcFactory());
}
@Bean
@Primary
public MongoDatabaseFactory mongoMpcFactory() throws Exception {
SimpleMongoClientDatabaseFactory simpleMongoClientDbFactory = new SimpleMongoClientDatabaseFactory(uri);
return simpleMongoClientDbFactory;
}
}
創(chuàng)建mongoSaasTemplate作用于"com.sun.mpc.example.storage.mongorpst.saas" 下的Repository
/**
* 初始化saas mongoSaasTemplate
* 如果不是多mongo數(shù)據(jù)源無需引入該配置
* 注:開啟多數(shù)據(jù)源配置需要排除springboot默認(rèn)的mongo初始化機(jī)制
* @SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
* @author liangjian
* @date
*/
@Slf4j
@Configuration
@EnableMongoRepositories(basePackages = "com.sun.mpc.example.storage.mongorpst.saas", mongoTemplateRef = "mongoSaasTemplate")
public class MongoSaasTemplateConfig {
@Value("${spring.data.mongodb.saas.uri}")
private String uri;
@Primary
@Bean(name = "mongoSaasTemplate")
public MongoTemplate mongoSaasTemplate() throws Exception {
log.info("-----------------------init mongoSaasTemplate success-----------------------------------");
return new MongoTemplate(mongoSaasFactory());
}
@Bean
@Primary
public MongoDatabaseFactory mongoSaasFactory() throws Exception {
SimpleMongoClientDatabaseFactory simpleMongoClientDbFactory = new SimpleMongoClientDatabaseFactory(uri);
return simpleMongoClientDbFactory;
}
}
4.包結(jié)構(gòu)截圖

package com.example.dataview.uaa.repository;
import com.example.dataview.uaa.entity.MStudentTestEntity;
import org.springframework.data.mongodb.repository.MongoRepository;
/**
* @author andy
* @date 2022/11/9 17:53
*/
public interface MStudentTestEntityRepository extends MongoRepository<MStudentTestEntity, String> {
}
5.測試類
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestPropertySource(properties={"spring.profiles.active=int"})
public class MongoRepositoryMultiSourceTest {
@Autowired
private MStudentTestEntityRepository mstudentTestEntityRepository;
@Autowired
private SStudentTestEntityRepository sstudentTestEntityRepository;
@Test
public void contextLoads() {
mstudentTestEntityRepository.insert(MStudentTestEntity.builder()
.name("woshi m")
.age(20)
.sex(true)
.build());
sstudentTestEntityRepository.insert(SStudentTestEntity.builder()
.name("woshi s")
.age(20)
.sex(true)
.build());
}
}
最后雖然不是很詳細(xì),也沒有具體說明,但是我想凡是對這塊稍微有點了解跟研究的,一定能看懂,至此簡單集成已經(jīng)完成并且滿足基本需求。
6.擴(kuò)展 (選讀)設(shè)置 auto_index_creation = true 自動創(chuàng)建索引失效問題
由于我們覆蓋了 spring boot 自動裝配mongo配置,導(dǎo)致 實體類的字段注解 @Indexed 自動創(chuàng)建索引失效,即下面的yml 配置不起作用。
spring:
data:
mongodb:
auto-index-creation: true #自動創(chuàng)建索引
為了解決這個問題我對配置類做了優(yōu)化如下:
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.domain.EntityScanner;
import org.springframework.boot.context.properties.PropertyMapper;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.annotation.Persistent;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.SimpleMongoClientDatabaseFactory;
import org.springframework.data.mongodb.core.convert.DbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
import java.util.Collections;
/**
* 初始化saas mongoSaasTemplate
* 如果不是多mongo數(shù)據(jù)源無需引入該配置
* 注:開啟多數(shù)據(jù)源配置需要排除springboot默認(rèn)的mongo初始化機(jī)制
* @SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoDataAutoConfiguration.class})
* @author liangjian
* @date
*/
@Slf4j
@Configuration
@EnableMongoRepositories(basePackages = "com.sun.mpc.example.storage.mongorpst.saas", mongoTemplateRef = "mongoSaasTemplate")
public class MongoSaasTemplateConfig {
@Value("${spring.data.mongodb.saas.uri}")
private String uri;
@Bean
public MongoTemplate mongoSaasTemplate(MongoDatabaseFactory mongoSaasFactory, MappingMongoConverter mongoSaasConverter) throws Exception {
log.info("-----------------------init mongoSaasTemplate success-----------------------------------");
return new MongoTemplate(mongoSaasFactory,mongoSaasConverter);
}
@Bean
public MongoDatabaseFactory mongoSaasFactory() throws Exception {
SimpleMongoClientDatabaseFactory simpleMongoClientDbFactory = new SimpleMongoClientDatabaseFactory(uri);
return simpleMongoClientDbFactory;
}
/**
* 設(shè)置AutoIndexCreation 等于 true 自動創(chuàng)建索引
* @param mongoSaasFactory
* @return org.springframework.data.mongodb.core.convert.MappingMongoConverter
* @author liangjian
*/
@Bean
MappingMongoConverter mongoSaasConverter(MongoDatabaseFactory mongoSaasFactory, ApplicationContext applicationContext) throws Exception {
MongoCustomConversions conversions = new MongoCustomConversions(Collections.emptyList());
DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoSaasFactory);
PropertyMapper mapper = PropertyMapper.get().alwaysApplyingWhenNonNull();
MongoMappingContext context = new MongoMappingContext();
mapper.from(true).to(context::setAutoIndexCreation);
context.setInitialEntitySet(new EntityScanner(applicationContext).scan(Document.class, Persistent.class));
context.setSimpleTypeHolder(conversions.getSimpleTypeHolder());
MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);
mappingConverter.setCustomConversions(conversions);
return mappingConverter;
}
}
注意這段代碼:
mapper.from(true).to(context::setAutoIndexCreation);
我寫死為true 相當(dāng)于無需yml配置即可實現(xiàn)自動創(chuàng)建索引,讀者可根據(jù)實際情況,選擇從yaml 中讀取 auto-index-creation: true 配置,實現(xiàn)動態(tài)配置
完結(jié)~~~
————————————————
版權(quán)聲明:本文為CSDN博主「五系」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u013753310/article/details/117336385