Spring 配置元数据
Spring Configuration Metadata
我正在使用 spring 引导设置两个数据源,如此处所示 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、用户名、密码等,但实现 类 包含。我设置了注释处理器,在处理具体 类 时它工作正常。
我注意到 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
既然有人不厌其烦地为这个问题 +1,我想我会 post 一个解决方案。请注意,我认为 DataSource
上的 @ConfigurationProperties
本身是不必要的,因为它们已经设置在用于构建 DataSource
的 DataSourceProperties
上,但我将其留在这是因为 Spring 团队在 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration
中就是这样做的。我唯一的猜测是,如果您的 DataSource
具有可以设置的其他属性而不是 DataSourceProperties
中公开的属性,那么您会在 "Spring Boot application.properties editor" 中收到这些属性的警告。
请注意,如果在类路径中找到 DataSource
,DataSourceBuilder
将按此顺序使用 Tomcat、HikariCP 或 Commons DBCP,除非您使用 dataSourceBuilder.type(Class<? extends DataSource>)
[= 指定其他内容22=]
属性:
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();
}
我正在使用 spring 引导设置两个数据源,如此处所示 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、用户名、密码等,但实现 类 包含。我设置了注释处理器,在处理具体 类 时它工作正常。
我注意到 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
既然有人不厌其烦地为这个问题 +1,我想我会 post 一个解决方案。请注意,我认为 DataSource
上的 @ConfigurationProperties
本身是不必要的,因为它们已经设置在用于构建 DataSource
的 DataSourceProperties
上,但我将其留在这是因为 Spring 团队在 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration
中就是这样做的。我唯一的猜测是,如果您的 DataSource
具有可以设置的其他属性而不是 DataSourceProperties
中公开的属性,那么您会在 "Spring Boot application.properties editor" 中收到这些属性的警告。
请注意,如果在类路径中找到 DataSource
,DataSourceBuilder
将按此顺序使用 Tomcat、HikariCP 或 Commons DBCP,除非您使用 dataSourceBuilder.type(Class<? extends DataSource>)
[= 指定其他内容22=]
属性:
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();
}