两个具有不同属性的 Mongo 存储库 [英] Two Mongo repositories with different properties
问题描述
我有两个存储库:
@Repository
public interface SpringLRepository extends MongoRepository<L, String> {
}
@Repository
public interface SpringSRepository extends MongoRepository<S, String> {
}
在 properties
文件中我有:
spring.data.mongodb.authentication-database=admin
spring.data.mongodb.l.host=localhost
spring.data.mongodb.l.port=27017
spring.data.mongodb.l.username=root
spring.data.mongodb.l.password=example
spring.data.mongodb.l.authentication-database=admin
spring.data.mongodb.l.database=l
spring.data.mongodb.s.host=localhost
spring.data.mongodb.s.port=27017
spring.data.mongodb.s.username=root
spring.data.mongodb.s.password=example
spring.data.mongodb.s.authentication-database=admin
spring.data.mongodb.s.database=s
我想为 SpringLRepository
和 SpringSRepository
设置单独的属性,或者只更改其中的一部分,例如 spring.data.mongodb.database
参数.
I want to have seperate properties for SpringLRepository
and SpringSRepository
or only change part of them like spring.data.mongodb.database
parameter.
我试着遵循这个:配置多个MongoDB存储库使用 Spring Data Mongo
首先,如果我不排除 MongoDataAutoConfiguration.class
:
First if i don't exclude MongoDataAutoConfiguration.class
:
@SpringBootApplication(
exclude = {
//MongoDataAutoConfiguration.class
})
我有:
Parameter 1 of method gridFsTemplate in org.springframework.boot.autoconfigure.data.mongo.MongoDbFactoryDependentConfiguration required a single bean, but 2 were found:
- mongoLTemplate: defined by method 'mongoLTemplate' in class path resource [...l/core/application/LMongoConfig.class]
- mongoSTemplate: defined by method 'mongoSTemplate' in class path resource [...s/core/application/SMongoConfig.class]
我该怎么办?
现在我不再使用 @Repository
并且我添加了两个类.第一个配置:
Now I don't use @Repository
anymore and I've added two classes.
First config:
@Configuration
@EnableMongoRepositories(
basePackages = "...s.infrastructure.secondary.persistence",
mongoTemplateRef = "mongoSTemplate"
)
public class SMongoConfig {
@Value("${spring.data.mongodb.lead.host}")
private String mongoHost;
@Value("${spring.data.mongodb.lead.port}")
private Integer mongoPort;
@Bean
@Qualifier("mongoSTemplate")
MongoTemplate mongoSTemplate(@Qualifier("mongoSDbFactory") MongoDbFactory mongoDbFactory, MongoConverter converter) {
MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, converter);
mongoTemplate.setWriteConcern(WriteConcern.MAJORITY);
mongoTemplate.setWriteResultChecking(WriteResultChecking.EXCEPTION);
return mongoTemplate;
}
@Bean
@Qualifier("mongoSimulationsDbFactory")
public MongoDbFactory mongoSimulationsDbFactory() {
MongoClientOptions.Builder mongoOperations = MongoClientOptions.builder();
mongoOperations.socketTimeout(1000 * 2);
mongoOperations.connectTimeout(1000 * 2);
MongoCredential mongoCredential = MongoCredential.createCredential("root", "admin", "example".toCharArray());
return new SimpleMongoDbFactory(
new MongoClient(
new ServerAddress(mongoHost, mongoPort),
Collections.singletonList(mongoCredential)
),
"s");
}
}
第二个配置:
@Configuration
@EnableMongoRepositories(
basePackages = "...l.infrastructure.secondary.persistence",
mongoTemplateRef = "mongoLTemplate"
)
public class LMongoConfig{
@Value("${spring.data.mongodb.l.host}")
private String mongoHost;
@Value("${spring.data.mongodb.l.port}")
private Integer mongoPort;
@Value("${spring.data.mongodb.l.database}")
private String mongoDB;
@Value("${spring.data.mongodb.l.password}")
private char[] mongoPassword;
@Bean
@Qualifier("mongoLTemplate")
MongoTemplate mongoLTemplate(@Qualifier("mongoLDbFactory") MongoDbFactory mongoDbFactory, MongoConverter converter) {
MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, converter);
mongoTemplate.setWriteConcern(WriteConcern.MAJORITY);
mongoTemplate.setWriteResultChecking(WriteResultChecking.EXCEPTION);
return mongoTemplate;
}
@Bean
@Qualifier("mongoLDbFactory")
public MongoDbFactory mongoLDbFactory() {
MongoClientOptions.Builder mongoOperations = MongoClientOptions.builder();
mongoOperations.socketTimeout(1000 * 2);
mongoOperations.connectTimeout(1000 * 2);
MongoCredential mongoCredential = MongoCredential.createCredential("root", "admin", "example".toCharArray());
return new SimpleMongoDbFactory(
new MongoClient(
new ServerAddress(mongoHost, mongoPort),
Collections.singletonList(mongoCredential)
),
"s");
}
}
现在这段代码将 s
和 l
保存到单独的存储库中,但是我有几个问题.SimpleMongoDbFactory
和 MongoClient
已弃用,并且很难找到更新的 Mongo
示例.
Now this code save s
and l
to seperate repositories but
I have a few concerns.
SimpleMongoDbFactory
and MongoClient
are deprecated and it's hard to find newer example of Mongo
doing that.
推荐答案
@Bean
public SimpleMongoClientDbFactory metadataFactory(final MongoProperties mongo) throws Exception {
return new SimpleMongoClientDbFactory(mongo.getUri());
}
@Bean
public MongoConfigurationProperties mongoProperties() {
return new MongoConfigurationProperties();
}
我用这个.AFAIK 它没有被弃用.在这种情况下,mongoProperties 是一个指向 uri 的 @ConfigurationProperties bean - 需要多个 URI,因为我在这个应用程序中连接到多个数据库.
I use this. AFAIK it's not deprecated. In this case mongoProperties is a @ConfigurationProperties bean which points to the uri - need multiple URIs since I connect to multiple databases in this app.
这篇关于两个具有不同属性的 Mongo 存储库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!