Как переключаться между несколькими экземплярами репозитория с пружинной загрузкой - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь завершить этот класс, который позволит мне переключаться между репозиториями. Я не уверен, как это сделать. Я хочу использовать экземпляры по умолчанию через Spring Boot Injection! Я знаю, что я делаю это неправильно, я не могу передать нулевое значение этим классом init.

@Configuration
public class ApiRepositoryConfig {

    @Bean
    @ConditionalOnProperty(name = "db.dialect", havingValue = "postgres", matchIfMissing = true)
    public ApiRepository apiJpaRepository() {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("com.tw.api");
        return new ApiJpaRepository(ApiApplication.class, emf.createEntityManager());
    }

    @Bean
    @ConditionalOnProperty(name = "db.dialect", havingValue = "mongo")
    public ApiRepository apiMongoRepository() {
        return new ApiMongoRepository(null, null);
    }
}

Класс ApiJpaRepository

@NoRepositoryBean
public class ApiJpaRepository<T, Id>
        extends SimpleJpaRepository<T, Id> implements ApiRepository<T, Id> {

    public ApiJpaRepository(Class<T> domainClass, EntityManager entityManager) {
        super(domainClass, entityManager);
    }
}

Класс ApiMongoRepository

public class ApiMongoRepository<T, Id> extends SimpleMongoRepository<T, Id> implements ApiRepository<T, Id> {

    public ApiMongoRepository(MongoEntityInformation<T, Id> metadata, MongoOperations mongoOperations) {
        super(metadata, mongoOperations);
    }
}

Базовый интерфейс класса

public interface ApiRepository<T, Id> extends CrudRepository<T, Id> {
}

Вот ссылка на проект, если кто-то хочет получить полную картинку, https://github.com/er310/boot-camp/tree/master/api

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Вы были близки.

  1. С ConditionalOn..
//matchIfMissing = true for primary datasource
@Bean
@ConditionalOnProperty(value = "db.dialect.postgres.enabled", havingValue = "true", matchIfMissing = true)
...
@Bean
@ConditionalOnProperty(value = "db.dialect.mongo.enabled", havingValue = "true")

Риски: если кто-то включит включение для нескольких приложений источника данных, в итоге будет sh, в конце концов

Подход пружинных профилей
@Configuration
@Profile("mongo")
public class MongoConfiguration {
    ... all the mongo beans
}

То же самое для любого другого источника данных
Использование:

#application.yml

spring:
  profiles:
    active: mongo

Я бы предложил использовать профили, потому что это более осознанно посмотри что включено или нет.
Как вы или рецензент кода, наверняка увидите, что вы активируете несколько профилей базы данных одновременно

0 голосов
/ 15 апреля 2020

Мне удалось решить эту проблему путем реализации фабричного компонента для каждого источника данных и конфигурации, указывающей на них. Кроме того, мне пришлось исключить конфигурацию Spring jpa & mon go из @SpringBootApplication.

Исправления доступны здесь,

https://github.com/er310/boot-camp/tree/master/api

...