具有多个模块的Spring数据无法正常运行

时间:2019-03-25 12:27:46

标签: spring-boot spring-data-jpa spring-data spring-data-mongodb

我正在尝试建立一个包含两个数据源的项目,一个是MongoDB,另一个是Postgres。我使用不同的程序包为每个数据源提供了存储库,并对我的主类进行了如下注释:

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

MongoDBConfiguration:

@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来自外部库,它是常规的CrudRepository(这完全有意义,因为该库的使用者可以决定他将使用哪种类型的数据库喜欢使用)。无论如何,即使我仅在@EnableMongoRepositories Spring Data中指定了 com.atlassian.connect.spring 程序包,我指定的basePackages仍被完全忽略并且没有以任何方式使用应该使用模块。 难道我做错了什么?还有什么其他办法可以让Spring数据在不更改AtlassianHostRepository.class本身的情况下将mongo用于AtlassianHostRepository?

1 个答案:

答案 0 :(得分: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 一起使用(尽管我可能是错的)。