具有多个模块的Spring数据不起作用

问题描述 投票:0回答:1

我正在尝试建立一个包含两个数据源的项目,一个是MongoDB,另一个是Postgres。我有不同包中的每个数据源的存储库,我按如下方式注释我的主类:

@Import({MongoDBConfiguration.class, PostgresDBConfiguration.class})
@SpringBootApplication(exclude = {
        MongoRepositoriesAutoConfiguration.class,
        JpaRepositoriesAutoConfiguration.class
})
public class TemporaryRunner implements CommandLineRunner {
...
}

MongoDB配置:

@Configuration
@EnableMongoRepositories(basePackages = {
        "com.example.datastore.mongo",
        "com.atlassian.connect.spring"})
public class MongoDBConfiguration {
...
}

PostgresDBConfiguration:

@Configuration
@EnableJpaRepositories(basePackages = {
        "com.example.datastore.postgres"
})
public class PostgresDBConfiguration {
...
}

即使我按照documentation中的描述指定了基本软件包,我仍然在控制台中获取这些消息:

13:10:44.238 [main] [] INFO  o.s.d.r.c.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode!
13:10:44.266 [main] [] INFO  o.s.d.r.c.RepositoryConfigurationExtensionSupport - Spring Data MongoDB - Could not safely identify store assignment for repository candidate interface com.atlassian.connect.spring.AtlassianHostRepository.

我设法通过使用MongoRepository和JpaRepository为我的所有存储库解决了这个问题,但AtlassianHostRepository来自外部lib并且它是一个常规的CrudRepository(这完全有意义,因为lib的使用者可以决定他想要使用什么类型的数据库)。无论如何,它看起来我指定的basePackages被完全忽略并且没有以任何方式使用,即使我只在@EnableMongoRepositories中指定了com.atlassian.connect.spring包Spring Data也不知道应该使用哪个数据模块。难道我做错了什么?有没有其他方法可以告诉spring数据使用mongo for AtlassianHostRepository而不更改AtlassianHostRepository.class本身?

spring-boot spring-data-jpa spring-data spring-data-mongodb
1个回答
0
投票

我发现唯一可行的解​​决方案是让spring数据忽略AtlassianHostRepository(因为它无法确定要使用哪个数据源),然后为它创建一个单独的配置,并简单地手动创建它:

@Configuration
@Import({MongoDBConfiguration.class})
public class AtlassianHostRepositoryConfiguration {

    private final MongoTemplate mongoTemplate;

    @Autowired
    public AtlassianHostRepositoryConfiguration(final MongoTemplate mongoTemplate) {
        this.mongoTemplate = mongoTemplate;
    }

    @Bean
    public AtlassianHostRepository atlassianHostRepository() {
        RepositoryFactorySupport factory = new MongoRepositoryFactory(mongoTemplate);
        return factory.getRepository(AtlassianHostRepository.class);
    }
}

这个解决方案适用于从库中使用的少量或有限数量的存储库,当有更多存储库时,手动创建所有存储库会相当麻烦,但在阅读了spring-data的源代码后,我认为没办法使其与basePackages一起工作,如文档中所述(尽管我可能错了)。

© www.soinside.com 2019 - 2024. All rights reserved.