Данные Spring с несколькими модулями не работают - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь создать проект с двумя источниками данных, один - 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 {
...
}

И хотя я указал базовые пакеты, как описано в документации , я все равно получаю эти сообщения в консоли:

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 полностью игнорируются и никоим образом не используются, хотя я указал пакет com.atlassian.connect.spring только в @EnableMongoRepositories. Spring Data каким-то образом не может определить, какой модуль данныхдолжен быть использован.Я делаю что-то неправильно?Есть ли другой способ, которым я мог бы сказать весенним данным использовать mongo для AtlassianHostRepository без изменения самого AtlassianHostRepository.class?

1 Ответ

0 голосов
/ 25 марта 2019

Единственное рабочее решение, которое я нашел, состояло в том, чтобы позволить весенним данным игнорировать 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 , как указано в документации (хотя я могу ошибаться).

...