两个具有不同属性的 Mongo 存储库 [英] Two Mongo repositories with different properties

查看:47
本文介绍了两个具有不同属性的 Mongo 存储库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个存储库:

@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

我想为 SpringLRepositorySpringSRepository 设置单独的属性,或者只更改其中的一部分,例如 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");
    }
}

现在这段代码将 sl 保存到单独的存储库中,但是我有几个问题.SimpleMongoDbFactoryMongoClient 已弃用,并且很难找到更新的 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆