Spring配置元数据

时间:2015-10-01 01:03:48

标签: spring spring-boot spring-tool-suite

我正在设置两个数据源,如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

1 个答案:

答案 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();
}