Условно автоматическое подключение Spring Data Repositories - PullRequest
2 голосов
/ 30 октября 2019

У меня есть проект REST API, который использует несколько бэкэндов (упакованных в разные банки). Я использую @ConditionalOnProperty в классах конфигурации Java, чтобы определить, какой сервер будет настроен. Допустим, есть бэкэнд с реляционной базой данных и jar MongoDB Spring Data. Если проект развернут в среде с базой данных mysql, следует использовать первый бэкэнд. Проект должен быть предварительно собран, и перед развертыванием будет изменено только свойство в файле application.properties.

Есть ли способ условно автоматически связать соответствующие репозитории? Например, в классе Spring Service у меня будет что-то вроде:


@Service
public class MyService {

@Autowired
private UserMySqlRepository repo1;

@Autowired
private UserMongoDBRepository repo2;

}

UserMySqlRepository расширит JpaRepository, а UserMongoDBRepository расширит MongoDbRepository. Можно ли аннотировать эти поля с помощью @Conditional и автоматически связывать их только при использовании соответствующей конфигурации? Если нет, то какой лучший способ сделать это?

Ответы [ 2 ]

4 голосов
/ 30 октября 2019

Да! Вы можете реализовать стратегию проектирования шаблона. Сделайте так, чтобы ваши классы репозитория имели общий интерфейс, чтобы возвращаемый тип оставался тем жеВ вашем файле конфигурации определите метод bean-компонента таким образом, что вы проверяете, для какой базы данных настроена, и соответственно возвращаете объект.

interface UserRepository {
//...
}

interface UserMySqlRepository extends UserRepository {
//...
}

interface UserMongoDBRepository extends UserRepository {
//...
}

@Configuration
class DbBeansConfig{

@Bean
public UserRepository getUserRepository(){

  if(mysql configured){// give your impl here
     return new UserMySqlRepository(); // your bean here
   }else{
      return new UserMongoDBRepository (); // your bean here
   }
 }
}
0 голосов
/ 30 октября 2019

Мы можем использовать атрибут withValue, чтобы указать определенные значения свойства usemysql, которые должны быть сопоставлены. Позволяет определить bean-компонент dataSource со значениями по умолчанию, которые подключаются к локальной базе данных myDb, если для свойства usemysql установлено значение local:

@Bean
@ConditionalOnProperty(
  name = "usemysql", 
  havingValue = "local")
@ConditionalOnMissingBean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();

    dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
    dataSource.setUrl("jdbc:mysql://localhost:3306/myDb?createDatabaseIfNotExist=true");
    dataSource.setUsername("mysqluser");
    dataSource.setPassword("mysqlpass");

    return dataSource;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...