通过Spring连接到两个MongoDB时出现问题

时间:2018-01-31 09:45:24

标签: mongodb spring-data

我正在尝试使用Spring连接到两个不同的MongoDB(1.5.2。 - >我们在内部框架中包含Spring,因此它不是最新版本)这已经部分但不完全。更确切地说,我发现了一种奇怪的行为,我将在展示我的设置后在下面描述。

所以这就是我到目前为止所做的:

项目结构

backend
    config
    domain
        customer
        internal
    repository
        customer
        internal
    service

config我有我的Mongoconfigurations。

我创建了一个扩展AbstractMongoConfiguration的基类。此类包含数据库,主机等的字段,这些字段填充了application.yml中的属性。它还包含一些创建MongoClientSimpleMongoDbFactory的方法。

此外,还有两个自定义配置类。对于每个MongoDB一个配置。两者都扩展了基类。

以下是它们的编码方式:

主要连接

@Primary
@EntityScan(basePackages = "backend.domain.customer")
@Configuration
@EnableMongoRepositories(
        basePackages = {"backend.repository.customer"}, 
        mongoTemplateRef = "customerDataMongoTemplate")
@ConfigurationProperties(prefix = "customer.mongodb")
public class CustomerDataMongoConnection extends BaseMongoConfig{

    public static final String TEMPLATE_NAME = "customerDataMongoTemplate";

    @Override
    @Bean(name = CustomerDataMongoConnection.TEMPLATE_NAME)
    public MongoTemplate mongoTemplate() {
        MongoClient client = getMongoClient(getAddress(), 
        getCredentials());
        SimpleMongoDbFactory factory = getSimpleMongoDbFactory(client, 
        getDatabaseName());
        return new MongoTemplate(factory);
    }
}

第二个配置类看起来非常相似。这是:

@EntityScan(basePackages = "backend.domain.internal")
@Configuration
@EnableMongoRepositories(
    basePackages = {"backend.repository.internal"}
    mongoTemplateRef = InternalDataMongoConnection.TEMPLATE_NAME
            )
@ConfigurationProperties(prefix = "internal.mongodb")
public class InternalDataMongoConnection extends BaseMongoConfig{

    public static final String TEMPLATE_NAME = "internalDataMongoTemplate";

    @Override
    @Bean(name = InternalDataMongoConnection.TEMPLATE_NAME)
    public MongoTemplate mongoTemplate() {
        MongoClient client = getMongoClient(getAddress(), getCredentials());
        SimpleMongoDbFactory factory = getSimpleMongoDbFactory(client, 
        getDatabaseName());
        return new MongoTemplate(factory);
    }
}

如您所见,我使用EnableMongoRepositories来定义哪个存储库应该使用哪个连接。

我的存储库的定义与Spring文档中描述的一样。

但是,这是一个位于包backend.repository.customer中的示例:

public interface ContactHistoryRepository extends MongoRepository<ContactHistoryEntity, String> {
    public ContactHistoryEntity findById(String id);
}

问题是我的后端始终只使用此设置的主连接。有趣的是,当我删除MongoTemplate(仅@Bean)的beanname时,后端会使用辅助连接(InternalMongoDataConnection)。对于所有已定义的存储库都是如此。

我的问题是,我怎样才能实现我的后端真正处理这两种联系?可能我错过了设置另一个参数/配置?

由于这是一篇相当广泛的帖子,如果我忘记了提及的话,我会道歉。请在评论中询问缺失的信息。

1 个答案:

答案 0 :(得分:0)

我找到了答案。 在我的包结构中,有一个空配置类(我的同事),注释为@Configuration@EnableMongoRepositories。这触发了Stpring Data的自动布线过程,因此导致了我上面报告的问题。 我只是删除了这个类,现在它可以正常工作!