【问题标题】:Spring data with multiple modules not working具有多个模块的 Spring 数据不起作用
【发布时间】:2019-03-25 12:27:45
【问题描述】:

我正在尝试建立一个具有两个数据源的项目,一个是 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 {
...
}

PostgresDB配置:

@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(这完全有道理,因为库的使用者可以决定他将使用哪种类型的数据库喜欢用)。无论如何,看起来我指定的 basePackages 被完全忽略并且没有以任何方式使用,即使我仅在 @EnableMongoRepositories Spring Data 中指定了 com.atlassian.connect.spring 包,Spring Data 不知何故无法弄清楚哪些数据应该使用模块。 难道我做错了什么?有没有其他方法可以告诉 spring data 在不更改 AtlassianHostRepository.class 本身的情况下将 mongo 用于 AtlassianHostRepository?

【问题讨论】:

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


    【解决方案1】:

    我找到的唯一可行的解​​决方案是让 spring data 忽略 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 一起使用(尽管我可能错了)。

    【讨论】:

      猜你喜欢
      • 2022-08-07
      • 2019-08-08
      • 2018-09-27
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      • 2012-01-06
      相关资源
      最近更新 更多