0

My application.properties

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=${env.H2_USER}
spring.datasource.password=${env.H2_PASS}

spring.token-datasource.url=jdbc:mysql://${env.MYSQL_HOST}/${env.MYSQL_DB}
spring.token-datasource.username=${env.MYSQL_USER}
spring.token-datasource.password=${env.MYSQL_PASS}

My Configuration.java code snippet

@Configuration
public class DataSourceConfiguration {

    @Bean
    @Primary
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource regularDataSource() {
        DataSource dataSource = DataSourceBuilder.create().build();
        return dataSource;
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.token-datasource")
    public DataSource tokenDataSource() {
        DataSource dataSource = DataSourceBuilder.create().build();
        return dataSource;
    }
}

However, if I put a break point at each of return dataSource;, I see the DataSource object not populated with the correponding property values, e.g. jdbcUrl would be null.

enter image description here

Any help?

Thanks!

wxh
  • 69
  • 7

1 Answers1

0

Followed https://docs.spring.io/spring-boot/docs/2.4.2/reference/html/howto.html#howto-two-datasources and crafted following code which works:

@Configuration
public class DataSourceConfiguration {

    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource")
    public DataSourceProperties regularDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @Primary
    @ConfigurationProperties("spring.datasource.configuration")
    public HikariDataSource regularDataSource() {
        HikariDataSource dataSource = regularDataSourceProperties().initializeDataSourceBuilder()
                .type(HikariDataSource.class).build();
        return dataSource;
    }

    @Bean
    @ConfigurationProperties("spring.token-datasource")
    public DataSourceProperties tokenDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @ConfigurationProperties("spring.token-datasource.configuration")
    public DataSource tokenDataSource() {
        DataSource dataSource = tokenDataSourceProperties().initializeDataSourceBuilder().build();
        return dataSource;
    }
}

It's interesting that the original code snippet does NOT work, while it's still the approach recommened by many Java tutorials and stackoverflow posts. For example,

wxh
  • 69
  • 7