我正在设置两个数据源,如http://docs.spring.io/spring-boot/docs/1.3.0.M2/reference/htmlsingle/#howto-two-datasources所示,使用spring boot,但是这样做时application.properties
会显示警告,例如x.x.username
是一个未知属性。这在某种程度上是正确的,因为javax.sql.DataSource
不包含url,用户名,密码等,但实现类的确如此。我有一个注释处理器设置,它在使用具体类时工作正常。
我注意到org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration
同时使用了DataSourceProperties
并在@ConfigurationProperties
上注明了dataSource()
。这可能会摆脱我的警告,但重点是什么。是不是以这种方式设置了两次属性?
配置:
@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
答案 0 :(得分:1)
由于有人为这个问题+1而烦恼,我以为我会发布一个解决方案。请注意,我认为@ConfigurationProperties
上的DataSource
本身是不必要的,因为它们已经设置在用于构建DataSourceProperties
的{{1}}上,但我保留了DataSource
那是因为Spring团队在org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration
中的表现如何。我唯一的猜测是,如果你的DataSource
有其他属性可以设置,而不是DataSourceProperties
中公开的属性,那么你会在" Spring Boot应用程序中收到警告.properties编辑"对于那些属性。
请注意DataSourceBuilder
如果在Classpath上找到DataSource
,则会按顺序使用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();
}