Выбор правильного Бина при запуске - PullRequest
0 голосов
/ 06 июля 2018

У меня есть два компонента для DataConnection, определенных в моем приложении.

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DriverManagerDataSource;

import javax.sql.DataSource;

public class ApplicationConfiguration {

    @Bean
    @Primary
    @ConfigurationProperties(prefix="spring.datasource")
    public DataSource primaryDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://172.17.0.3:3306/gcdb");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        return dataSource;
    }


    @Bean
    @ConfigurationProperties(prefix="spring.seconddatasource")
    public DataSource secondaryDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName("org.h2.Driver");
        dataSource.setUrl("jdbc:h2:mem:gcdboff");
        dataSource.setUsername("root");
        dataSource.setPassword("root");
        return dataSource;
    }
}

Но поскольку иногда у нас нет подключения к Интернету, первый компонент не создается при каждом запуске, а завершается с ошибкой соединения.

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

Спасибо за помощь!

1 Ответ

0 голосов
/ 06 июля 2018

Не думаю, что вы можете просто сгенерировать исключение и позволить Spring Boot искать другой компонент.

Вы можете протестировать оба источника данных в компоненте @Primary DataSource и вернуть работающий источник данных.

Я видел, что вы используете @ConfigurationProperties, поэтому, я думаю, вы не вызываете dataSource.setPassword непосредственно в своем коде. В приведенном ниже примере вся необходимая информация будет считана из вашей конфигурации.

   @Primary
   @Bean
   public DataSource getDataSource(
         @Qualifier("first") DataSourceProperties first,
         @Qualifier("second") DataSourceProperties second) {
      final DataSource firstDataSource = first.initializeDataSourceBuilder().build();
//      try {
//         firstDataSource.getConnection();
//         ...
//      } catch (SQLException e) {
//         ...
//      }

//      return firstDataSource or secondDataSource;
   }

   @Primary
   @Bean("first")
   @ConfigurationProperties(prefix = "spring.datasource")
   public DataSourceProperties  getPrimaryStringProvider() {
      final DataSourceProperties dataSourceProperties = new DataSourceProperties();
      return dataSourceProperties;
   }

   @Bean("second")
   @ConfigurationProperties("spring.seconddatasource")
   public DataSourceProperties getSecondaryStringProvider() {
      return new DataSourceProperties();
   }

LE в качестве ответа на комментарий ниже:

Исключение было неверным. Он никогда не входил в блоке улова. Вы должны использовать коммуникационное исключение или исключение само по себе.

Он выдаст исключение SQLEx (точнее, в случае с MySQL это, вероятно, com.mysql.jdbc.public class CommunicationsException extends java.sql.SQLException).

Кроме того, мне пришлось вводить bean-компоненты в классе Application. В противном случае бобы не были построены.

Вам просто нужно аннотировать ApplicationConfiguration с помощью @Configuration.

Я разместил в своем вопросе рабочее решение

Не думаю, что имеет смысл аннотировать метод с помощью @ConfigurationProperties(prefix="spring.datasource"). Значения, установленные в функции, будут перезаписаны любыми значениями , существующими из файла свойств после после выхода из метода primaryDataSource.

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