From f9d50ee86a48026c6dee1a77f1de0deeadcb238a Mon Sep 17 00:00:00 2001 From: Marten Deinum Date: Fri, 2 Oct 2020 10:12:41 +0200 Subject: [PATCH 1/2] Prefer JdbcTransactionManager over DataSourceTransactionManager Spring 5.3 introduced the JdbcTransactionManager with exception translation on commit and rollback. This commit updates the auto-configuration to use this implementation rather than DataSourceTransactionManager. See gh-23672 --- .../DataSourceTransactionManagerAutoConfiguration.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration.java index 63a3c598f68..8acc90e4258 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration.java @@ -30,12 +30,11 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.jdbc.core.JdbcTemplate; -import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.jdbc.support.JdbcTransactionManager; import org.springframework.transaction.TransactionManager; /** - * {@link EnableAutoConfiguration Auto-configuration} for - * {@link DataSourceTransactionManager}. + * {@link EnableAutoConfiguration Auto-configuration} for {@link JdbcTransactionManager}. * * @author Dave Syer * @author Stephane Nicoll @@ -55,9 +54,9 @@ public class DataSourceTransactionManagerAutoConfiguration { @Bean @ConditionalOnMissingBean(TransactionManager.class) - DataSourceTransactionManager transactionManager(DataSource dataSource, + JdbcTransactionManager transactionManager(DataSource dataSource, ObjectProvider transactionManagerCustomizers) { - DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(dataSource); + JdbcTransactionManager transactionManager = new JdbcTransactionManager(dataSource); transactionManagerCustomizers.ifAvailable((customizers) -> customizers.customize(transactionManager)); return transactionManager; } From 5beeeac4b356013b78d864bec4e155b92b116ff5 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Thu, 8 Oct 2020 15:59:34 +0200 Subject: [PATCH 2/2] Polish "Prefer JdbcTransactionManager over DataSourceTransactionManager" See gh-23672 --- ...rceTransactionManagerAutoConfiguration.java | 2 +- ...ansactionManagerAutoConfigurationTests.java | 18 ++++++++---------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration.java index 8acc90e4258..62df0eb3ecb 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfiguration.java @@ -50,7 +50,7 @@ public class DataSourceTransactionManagerAutoConfiguration { @Configuration(proxyBeanMethods = false) @ConditionalOnSingleCandidate(DataSource.class) - static class DataSourceTransactionManagerConfiguration { + static class JdbcTransactionManagerConfiguration { @Bean @ConditionalOnMissingBean(TransactionManager.class) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfigurationTests.java index 26fc979ff34..8caa9fb6644 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/jdbc/DataSourceTransactionManagerAutoConfigurationTests.java @@ -25,7 +25,7 @@ import org.junit.jupiter.api.Test; import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration; import org.springframework.boot.test.context.runner.ApplicationContextRunner; -import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.jdbc.support.JdbcTransactionManager; import org.springframework.transaction.TransactionManager; import static org.assertj.core.api.Assertions.assertThat; @@ -47,7 +47,7 @@ class DataSourceTransactionManagerAutoConfigurationTests { @Test void transactionManagerWithoutDataSourceIsNotConfigured() { - this.contextRunner.run((context) -> assertThat(context).doesNotHaveBean(DataSourceTransactionManager.class)); + this.contextRunner.run((context) -> assertThat(context).doesNotHaveBean(TransactionManager.class)); } @Test @@ -55,8 +55,8 @@ class DataSourceTransactionManagerAutoConfigurationTests { this.contextRunner.withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class)) .run((context) -> { assertThat(context).hasSingleBean(TransactionManager.class) - .hasSingleBean(DataSourceTransactionManager.class); - assertThat(context.getBean(DataSourceTransactionManager.class).getDataSource()) + .hasSingleBean(JdbcTransactionManager.class); + assertThat(context.getBean(JdbcTransactionManager.class).getDataSource()) .isSameAs(context.getBean(DataSource.class)); }); } @@ -68,9 +68,8 @@ class DataSourceTransactionManagerAutoConfigurationTests { "spring.transaction.rollback-on-commit-failure=true") .run((context) -> { assertThat(context).hasSingleBean(TransactionManager.class) - .hasSingleBean(DataSourceTransactionManager.class); - DataSourceTransactionManager transactionManager = context - .getBean(DataSourceTransactionManager.class); + .hasSingleBean(JdbcTransactionManager.class); + JdbcTransactionManager transactionManager = context.getBean(JdbcTransactionManager.class); assertThat(transactionManager.getDefaultTimeout()).isEqualTo(60); assertThat(transactionManager.isRollbackOnCommitFailure()).isTrue(); }); @@ -93,9 +92,8 @@ class DataSourceTransactionManagerAutoConfigurationTests { @Test void transactionWithMultipleDataSourcesAndPrimaryCandidateIsConfigured() { this.contextRunner.withUserConfiguration(MultiDataSourceUsingPrimaryConfiguration.class).run((context) -> { - assertThat(context).hasSingleBean(TransactionManager.class) - .hasSingleBean(DataSourceTransactionManager.class); - assertThat(context.getBean(DataSourceTransactionManager.class).getDataSource()) + assertThat(context).hasSingleBean(TransactionManager.class).hasSingleBean(JdbcTransactionManager.class); + assertThat(context.getBean(JdbcTransactionManager.class).getDataSource()) .isSameAs(context.getBean("test1DataSource")); }); }