我正在使用
spring boot设置两个数据源,如
http://docs.spring.io/spring-boot/docs/1.3.0.M2/reference/htmlsingle/#howto-two-datasources所示,但是这样做时我的application.properties显示警告,例如x.x.username是一个未知属性.这在某种程度上是正确的,因为javax.sql.DataSource不包含url,username,password等,但实现类却包含url,username,password等.我有一个注释处理器设置,它在使用具体类时工作正常.
我注意到org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration $NonEmbeddedConfiguration使用DataSourceProperties并在dataSource()上注释了@ConfigurationProperties.这可能会摆脱我的警告,但重点是什么.是不是这样设置两次属性?
配置:
@Bean
@Primary
@ConfigurationProperties(prefix="datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix="datasource.secondary")
public DataSource secondaryDataSource() {
return DataSourceBuilder.create().build();
}
带警告的属性:
datasource.primary.url=jdbc:...
datasource.primary.username=user
datasource.primary.password=password
datasource.secondary.url=jdbc:...
datasource.secondary.username=user
datasource.secondary.password=password
最佳答案 由于有人对这个问题感到困扰,我以为我会发布一个解决方案.请注意,我认为DataSources上的@ConfigurationProperties本身是不必要的,因为它们已经在用于构建DataSource的DataSourceProperties上设置,但是我把它放在那里因为这是Spring团队在org.springframework.boot中完成它的方式.autoconfigure.jdbc.DataSourceAutoConfiguration $NonEmbeddedConfiguration.我唯一的猜测是,如果您的DataSource具有可以设置的其他属性而不是DataSourceProperties中公开的属性,那么您将在“Spring Boot application.properties编辑器”中获取这些属性的警告.
请注意,如果在Classpath上找到DataSource,则DataSourceBuilder将按顺序使用Tomcat,HikariCP或Commons DBCP,除非您使用dataSourceBuilder.type指定其他内容(Class<?extends DataSource>)
属性:
datasource.primary.url=jdbc:...
datasource.primary.username=user
datasource.primary.password=password
datasource.secondary.url=jdbc:...
datasource.secondary.username=user
datasource.secondary.password=password
Java配置:
@Bean
@Primary
@ConfigurationProperties(prefix = "datasource.primary")
public DataSourceProperties primaryProps() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties(prefix = "datasource.secondary")
public DataSourceProperties secondaryProps() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties(prefix = "datasource.primary")
public DataSource secondaryDataSource() {
DataSourceProperties props = secondaryProps();
return DataSourceBuilder.create(props.getClassLoader())
.driverClassName(props.getDriverClassName())
.url(props.getUrl())
.username(props.getUsername())
.password(props.getPassword())
.build();
}
@Bean
@ConfigurationProperties(prefix = "datasource.primary")
public DataSource secondaryDataSource() {
DataSourceProperties props = secondaryProps();
return DataSourceBuilder.create(props.getClassLoader())
.driverClassName(props.getDriverClassName())
.url(props.getUrl())
.username(props.getUsername())
.password(props.getPassword())
.build();
}