From 6806276b64f0346663a284ede043d71346cd1a54 Mon Sep 17 00:00:00 2001 From: Andy Wilkinson Date: Mon, 23 Sep 2024 18:30:55 +0100 Subject: [PATCH] Retain jOOQ configuration bean when used defines a DSLContext bean Closes gh-42400 --- .../jooq/JooqAutoConfiguration.java | 42 ++++++++----------- .../jooq/JooqAutoConfigurationTests.java | 17 ++++++++ 2 files changed, 35 insertions(+), 24 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/JooqAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/JooqAutoConfiguration.java index 4580ed021c..ec63bae297 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/JooqAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jooq/JooqAutoConfiguration.java @@ -37,7 +37,6 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; import org.springframework.transaction.PlatformTransactionManager; @@ -53,6 +52,7 @@ import org.springframework.transaction.PlatformTransactionManager; @AutoConfiguration(after = { DataSourceAutoConfiguration.class, TransactionAutoConfiguration.class }) @ConditionalOnClass(DSLContext.class) @ConditionalOnBean(DataSource.class) +@EnableConfigurationProperties(JooqProperties.class) public class JooqAutoConfiguration { @Bean @@ -81,31 +81,25 @@ public class JooqAutoConfiguration { return ExceptionTranslatorExecuteListener.DEFAULT; } - @Configuration(proxyBeanMethods = false) + @Bean @ConditionalOnMissingBean(DSLContext.class) - @EnableConfigurationProperties(JooqProperties.class) - public static class DslContextConfiguration { - - @Bean - public DefaultDSLContext dslContext(org.jooq.Configuration configuration) { - return new DefaultDSLContext(configuration); - } - - @Bean - @ConditionalOnMissingBean(org.jooq.Configuration.class) - public DefaultConfiguration jooqConfiguration(JooqProperties properties, ConnectionProvider connectionProvider, - DataSource dataSource, ObjectProvider transactionProvider, - ObjectProvider executeListenerProviders, - ObjectProvider configurationCustomizers) { - DefaultConfiguration configuration = new DefaultConfiguration(); - configuration.set(properties.determineSqlDialect(dataSource)); - configuration.set(connectionProvider); - transactionProvider.ifAvailable(configuration::set); - configuration.set(executeListenerProviders.orderedStream().toArray(ExecuteListenerProvider[]::new)); - configurationCustomizers.orderedStream().forEach((customizer) -> customizer.customize(configuration)); - return configuration; - } + public DefaultDSLContext dslContext(org.jooq.Configuration configuration) { + return new DefaultDSLContext(configuration); + } + @Bean + @ConditionalOnMissingBean(org.jooq.Configuration.class) + public DefaultConfiguration jooqConfiguration(JooqProperties properties, ConnectionProvider connectionProvider, + DataSource dataSource, ObjectProvider transactionProvider, + ObjectProvider executeListenerProviders, + ObjectProvider configurationCustomizers) { + DefaultConfiguration configuration = new DefaultConfiguration(); + configuration.set(properties.determineSqlDialect(dataSource)); + configuration.set(connectionProvider); + transactionProvider.ifAvailable(configuration::set); + configuration.set(executeListenerProviders.orderedStream().toArray(ExecuteListenerProvider[]::new)); + configurationCustomizers.orderedStream().forEach((customizer) -> customizer.customize(configuration)); + return configuration; } } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jooq/JooqAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jooq/JooqAutoConfigurationTests.java index a26b633491..8e8025f3e6 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jooq/JooqAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jooq/JooqAutoConfigurationTests.java @@ -29,6 +29,7 @@ import org.jooq.TransactionContext; import org.jooq.TransactionProvider; import org.jooq.TransactionalRunnable; import org.jooq.impl.DataSourceConnectionProvider; +import org.jooq.impl.DefaultDSLContext; import org.jooq.impl.DefaultExecuteListenerProvider; import org.junit.jupiter.api.Test; @@ -214,6 +215,12 @@ class JooqAutoConfigurationTests { }); } + @Test + void autoConfiguredJooqConfigurationCanBeUsedToCreateCustomDslContext() { + this.contextRunner.withUserConfiguration(CustomDslContextConfiguration.class, JooqDataSourceConfiguration.class) + .run((context) -> assertThat(context).hasSingleBean(DSLContext.class).hasBean("customDslContext")); + } + static class AssertFetch implements TransactionalRunnable { private final DSLContext dsl; @@ -305,6 +312,16 @@ class JooqAutoConfigurationTests { } + @Configuration(proxyBeanMethods = false) + static class CustomDslContextConfiguration { + + @Bean + DSLContext customDslContext(org.jooq.Configuration configuration) { + return new DefaultDSLContext(configuration); + } + + } + @Order(100) static class TestExecuteListenerProvider implements ExecuteListenerProvider {