Spring Boot配置Akademiks与Options双数据源提示url未指定报错如何解决
问题根因
报错是两个问题共同导致的:
- 未关闭Spring Boot默认的数据源自动配置,自定义多数据源场景下,Spring Boot仍会尝试读取默认
spring.datasource.*前缀的配置,你未配置默认数据源就会抛出找不到url的异常 OptionsDbConfig类中数据源属性绑定前缀配置错误,无法正确读取application.properties中options数据源的url、账号密码等核心配置
修复步骤
1. 启动类排除自动配置
修改你的项目启动类,在@SpringBootApplication注解中排除数据源相关自动配置:
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class }) public class AkademiksApplication { public static void main(String[] args) { SpringApplication.run(AkademiksApplication.class, args); } }
2. 修正OptionsDbConfig配置
optionsDataSourceProperties的属性绑定前缀错误,需要调整为和Akademiks配置类相同的规则:
@Configuration @EnableTransactionManagement @EnableJpaRepositories(basePackages = "com.example.resource.akademiks.options.dao", entityManagerFactoryRef = "optionsEntityManagerFactory", transactionManagerRef = "optionsTransactionManager") public class OptionsDbConfig { // 修正前缀:读取options数据源的基础属性(url、driver、账号密码) @Bean @ConfigurationProperties("spring.datasource.options") public DataSourceProperties optionsDataSourceProperties() { return new DataSourceProperties(); } // 这里前缀不变,读取连接池专属配置 @Bean @ConfigurationProperties("spring.datasource.options.configuration") public DataSource optionsDataSource() { return optionsDataSourceProperties().initializeDataSourceBuilder() .type(BasicDataSource.class).build(); } @Bean(name = "optionsEntityManagerFactory") public LocalContainerEntityManagerFactoryBean optionsEntityManagerFactory(EntityManagerFactoryBuilder builder) { Map<String, Object> jpaProps = new HashMap<>(); jpaProps.put("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect"); return builder .dataSource(optionsDataSource()) .packages(MathsOptions.class, ChemistryOptions.class, PhysicsOptions.class) .properties(jpaProps) // 新增persistenceUnit避免冲突 .persistenceUnit("options") .build(); } @Bean public PlatformTransactionManager optionsTransactionManager( final @Qualifier("optionsEntityManagerFactory") LocalContainerEntityManagerFactoryBean optionsEntityManagerFactory ) { return new JpaTransactionManager(optionsEntityManagerFactory.getObject()); } }
3. 可选优化
建议在AkademiksDbConfig的akademiksEntityManagerFactory方法中也添加persistenceUnit配置,避免两个数据源的JPA上下文冲突:
@Primary @Bean(name = "akademiksEntityManagerFactory") public LocalContainerEntityManagerFactoryBean akademiksEntityManagerFactory(EntityManagerFactoryBuilder builder) { Map<String, Object> jpaProps = new HashMap<>(); jpaProps.put("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect"); return builder .dataSource(akademiksDataSource()) .packages(Mathematics.class, Chemistry.class, Physics.class) .properties(jpaProps) .persistenceUnit("akademiks") .build(); }
修改完成后重新启动项目即可正常加载双数据源。
内容的提问来源于stack exchange,提问作者Chinedu
相关产品推荐
相关产品推荐

