Обновлено после предложения:
У меня есть Java-приложение Springboot и два источника данных, определенных в application.properties:
spring.jpa.hibernate.ddl-auto=update
#online
spring.datasource.url=jdbc:mysql://172.17.0.2:3306/gcdb?allowPublicKeyRetrieval=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driverClassName=com.mysql.jdbc.Driver
#offline
spring.secondDatasource.url=jdbc:h2:mem:gcdboff
spring.secondDatasource.username=root
spring.secondDatasource.password=root
spring.secondDatasource.driverClassName=org.h2.Driver
# Enabling H2 Console
spring.h2.console.enabled=true
spring.h2.console.path=/h2
Оба соединения работают нормально после изменения учетных данных вручную с «источника данных» на «secondDatasource».
Но теперь я хотел бы добавить запасной вариант. Если «источник данных» недоступен, используйте «secondDatasource».
Я нашел следующее решение.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
@SpringBootApplication
public class GCApplication {
public static void main(String[] args) {
SpringApplication.run(GCApplication.class, args);
}
/**/
@Bean
@Primary
@ConfigurationProperties(prefix="spring.datasource")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix="spring.secondDatasource")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
/**/
}
Но теперь никто не побежит. Приложение заканчивается следующей ошибкой, и я понятия не имею, как это исправить.
2018-07-06 09:52:30.805 ERROR 28073 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unsatisfied dependency expressed through method 'entityManagerFactory' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'entityManagerFactoryBuilder' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Unsatisfied dependency expressed through method 'entityManagerFactoryBuilder' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jpaVendorAdapter' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.jpa.JpaVendorAdapter]: Factory method 'jpaVendorAdapter' threw exception; nested exception is java.lang.IllegalArgumentException: dataSource or dataSourceClassName or jdbcUrl is required.
at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:732) ~[spring-beans-5.0.7.RELEASE.jar:5.0.7.RELEASE]
[...]
Спасибо за помощь!