在我的Spring Boot应用程序中配置两个DataSource时,我遇到了最奇怪的情况:只有一个正常工作:
@Configuration
(...)
@Bean(destroyMethod = "close")
protected DataSource applicationDataSource(
(...)
return dataSource;
}
并且有两个:
@Configuration
(...)
@Bean(destroyMethod = "close")
@Primary
protected DataSource applicationDataSource(
(...)
return dataSource;
}
@Configuration
(...)
@Bean
protected DataSource localDataSource(
(...)
return dataSource;
}
(它们位于不同的配置文件中)
现在奇怪的是,有两个DS没有相关的特定错误。我得到的错误是一个看似无关的错误,说它找不到Injected bean实例(在与DataSources无关的完全不同的配置文件中)。我注意到当只使用一个DS时,DS bean在错误中显示的bean之前被实例化了,这让我觉得在定义两个DS时它们只是被忽略了。
我尝试了很多东西,包括将第二个bean声明为另一种类型的DS
@Configuration
(...)
@Bean
protected HikariDataSource localDataSource(
(...)
return dataSource;
}
但没有任何效果。
现在,对于最奇怪的事情,我通过将第二个bean声明为对象(!!!)来发现一个有效的黑客
@Configuration
(...)
@Bean
protected Object localDataSource(
(...)
return dataSource;
}
这个有效!!!我只需将其转换到别处(例如,实现SqlSessionFactoryBean或DataSourceTransactionManager)。
请注意,这些方法受到保护,但我也是公开测试的。至于Spring Boot应用程序,我测试了是否有排除
@Configuration
@SpringBootApplication
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
所以我得到了它的工作,一切都很好,但我无法弄清楚这是怎么发生的,我真的很想让它在没有黑客的情况下工作......
干杯。
答案 0 :(得分:0)
我怀疑你有一个自动装配问题,因为配置了两个类型为DataSource的bean,可能有一个标有@Primary的多个
打开org.springframework的日志记录应突出显示。发布启动日志。
您的修复工作正常,因为您实际上只创建了一个DataSource类型的bean,因此自动装配问题得到解决。