Spring配置元数据

Spring配置元数据,spring,spring-boot,spring-tool-suite,Spring,Spring Boot,Spring Tool Suite,我正在使用spring boot设置两个数据源,如此处所示,但在执行此操作时,我的应用程序.properties会显示警告,例如x.x.username是未知属性。这在某种程度上是正确的,因为javax.sql.DataSource不包含url、用户名、密码等,但实现类包含这些内容。我已经设置了注释处理器,它在处理具体类时运行良好 我注意到,org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmb

我正在使用spring boot设置两个数据源,如此处所示,但在执行此操作时,我的
应用程序.properties
会显示警告,例如
x.x.username
是未知属性。这在某种程度上是正确的,因为
javax.sql.DataSource
不包含url、用户名、密码等,但实现类包含这些内容。我已经设置了注释处理器,它在处理具体类时运行良好

我注意到,
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration
使用了
datasourceproperty
,并在
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这个问题,我想我应该发布一个解决方案。请注意,我认为
数据源
上的
@ConfigurationProperties
本身是不必要的,因为它们已在用于构建
数据源
数据源属性
上设置,但是我把它放在那里,因为Spring团队就是这样在
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration
中完成的。我唯一的猜测是,如果您的
数据源
具有可以设置的其他属性,而不是
数据源属性
中公开的属性,那么您将在“Spring Boot application.properties editor”中收到这些属性的警告


请注意,
DataSourceBuilder
如果在类路径上找到作为
DataSource
的对象,则将按照该顺序使用Tomcat、HikariCP或Commons DBCP,除非您使用
DataSourceBuilder.type指定其他内容(类您可以为您的配置添加一些代码吗?警告在哪里弹出?编译时与运行时?即使有警告,应用程序是否也能正常工作?抱歉,我想我遗漏了。警告是STS中的编辑器警告。他们有一个专门的spring boot属性文件编辑器。我只是在上面加上黄色下划线这些属性是因为注释处理器正在生成META-INF/spring-configuration-metadata.json文件,该文件说明它应该查看javax.sql.DataSource。我将在上面添加配置和一些带有警告的属性。这个问题实际上涉及到spring工具套件、spring引导和@ConfigurationProperties。
datasource.primary.url=jdbc:...
datasource.primary.username=user
datasource.primary.password=password

datasource.secondary.url=jdbc:...
datasource.secondary.username=user
datasource.secondary.password=password
@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();
}