其他分享
首页 > 其他分享> > Spring配置元数据

Spring配置元数据

作者:互联网

我正在使用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();
}

标签:spring,spring-boot-2,spring-tool-suite
来源: https://codeday.me/bug/20190706/1398609.html