I used spring boot 3.4.6 before and everything worked fine for my database configuration but now I have an error when I want to use spring boot 3.5.0:
Description:
Parameter 0 of method hikariDataSource in xxx.DatabaseConfiguration required a bean of type 'org.springframework.boot.autoconfigure.jdbc.DataSourceProperties' that could not be found.
Action:
Consider defining a bean of type 'org.springframework.boot.autoconfigure.jdbc.DataSourceProperties' in your configuration.
Indeed, to use LazyConnectionDataSourceProxy
I did this configuration:
In application class, I deactivate the auto configuration:
@EnableAutoConfiguration(exclude = { DataSourceAutoConfiguration.class })
I define my own configuration:
@Configuration
public class DatabaseConfiguration {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
public HikariDataSource hikariDataSource(DataSourceProperties properties) {
HikariDataSource hikariDataSource = createDataSource(properties, HikariDataSource.class);
if (StringUtils.hasText(properties.getName())) {
hikariDataSource.setPoolName(properties.getName());
}
return hikariDataSource;
}
protected static <T> T createDataSource(DataSourceProperties properties, Class<? extends DataSource> type) {
return (T) properties.initializeDataSourceBuilder().type(type).build();
}
@Primary
@Bean
public DataSource dataSource(HikariDataSource hikariDataSource) {
// Wrap hikariDataSource in a LazyConnectionDataSourceProxy
LazyConnectionDataSourceProxy lazyDataSource = new LazyConnectionDataSourceProxy();
lazyDataSource.setTargetDataSource(hikariDataSource);
return lazyDataSource;
}
}
To solve that error, I now have to explicitly add this to application class:
@EnableConfigurationProperties(DataSourceProperties.class)
Do you know what has changed that can explain this please?
The DataSourceAutoConfiguration
contains the @EnableConfigurationProperties(DataSourceProperties.class)
so obviously when you are excluding it that @EnableConfigurationProperties
doesn't apply either anymore. I suspect the better auto config support and conditionals parsing now resulted in that, which I think should be expected. IMHO it was strange that it worked (exclude the config but still use the properties).
Nonetheless I would strongly suggest you to ditch your whole DatabaseConfiguration
and the exclude and instead add a BeanPostProcessor
to wrap your DataSource
bean(s) in a LazyConnectionDataSourceProxy
.
@Bean
public static BeanPostProcessor lazyDataSourceWrapper() {
return new BeanPostProcessor() {
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof HikariDataSource ds) {
return new LazyConnectionDataSourceProxy(ds);
}
return bean;
}
}
}
This way you achieve exactly the same without you needing to mess around with excludes and your own datasource config.