From f5b8c5a72d09037755b812279ab3bf61b91ce417 Mon Sep 17 00:00:00 2001 From: Yanming Zhou Date: Mon, 14 Sep 2026 10:39:56 +0800 Subject: [PATCH] Align use of transaction manager in MongoDB support See gh-51725 Signed-off-by: Yanming Zhou --- .../BatchDataMongoAutoConfiguration.java | 10 ++-- .../BatchDataMongoAutoConfigurationTests.java | 49 ++++++++++++++++--- 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/module/spring-boot-batch-data-mongodb/src/main/java/org/springframework/boot/batch/mongodb/autoconfigure/BatchDataMongoAutoConfiguration.java b/module/spring-boot-batch-data-mongodb/src/main/java/org/springframework/boot/batch/mongodb/autoconfigure/BatchDataMongoAutoConfiguration.java index 9638437abb4..cda380c5449 100644 --- a/module/spring-boot-batch-data-mongodb/src/main/java/org/springframework/boot/batch/mongodb/autoconfigure/BatchDataMongoAutoConfiguration.java +++ b/module/spring-boot-batch-data-mongodb/src/main/java/org/springframework/boot/batch/mongodb/autoconfigure/BatchDataMongoAutoConfiguration.java @@ -49,12 +49,14 @@ import org.springframework.data.mongodb.MongoTransactionManager; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.convert.MappingMongoConverter; +import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.Isolation; /** * {@link EnableAutoConfiguration Auto-configuration} for Spring Batch using Data MongoDB. * * @author Stephane Nicoll + * @author Yanming Zhou * @since 4.1.0 */ @AutoConfiguration(before = { BatchAutoConfiguration.class, BatchJobLauncherAutoConfiguration.class }, @@ -93,15 +95,15 @@ public final class BatchDataMongoAutoConfiguration { private final MongoOperations mongoOperations; - private final MongoTransactionManager transactionManager; + private final PlatformTransactionManager transactionManager; private final @Nullable TaskExecutor taskExecutor; private final BatchDataMongoProperties properties; SpringBootBatchMongoConfiguration(MongoDatabaseFactory mongoDatabaseFactory, - ObjectProvider transactionManager, - @BatchTransactionManager ObjectProvider batchTransactionManager, + ObjectProvider transactionManager, + @BatchTransactionManager ObjectProvider batchTransactionManager, @BatchTaskExecutor ObjectProvider batchTaskExecutor, BatchDataMongoProperties properties) { this.mongoOperations = createMongoOperations(mongoDatabaseFactory); @@ -124,7 +126,7 @@ public final class BatchDataMongoAutoConfiguration { } @Override - protected MongoTransactionManager getTransactionManager() { + protected PlatformTransactionManager getTransactionManager() { return this.transactionManager; } diff --git a/module/spring-boot-batch-data-mongodb/src/test/java/org/springframework/boot/batch/mongodb/autoconfigure/BatchDataMongoAutoConfigurationTests.java b/module/spring-boot-batch-data-mongodb/src/test/java/org/springframework/boot/batch/mongodb/autoconfigure/BatchDataMongoAutoConfigurationTests.java index a16e6ac9003..dd05b603fc4 100644 --- a/module/spring-boot-batch-data-mongodb/src/test/java/org/springframework/boot/batch/mongodb/autoconfigure/BatchDataMongoAutoConfigurationTests.java +++ b/module/spring-boot-batch-data-mongodb/src/test/java/org/springframework/boot/batch/mongodb/autoconfigure/BatchDataMongoAutoConfigurationTests.java @@ -37,6 +37,7 @@ import org.springframework.data.mongodb.MongoDatabaseFactory; import org.springframework.data.mongodb.MongoTransactionManager; import org.springframework.data.mongodb.core.MongoExceptionTranslator; import org.springframework.data.mongodb.core.MongoOperations; +import org.springframework.transaction.PlatformTransactionManager; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.anyString; @@ -49,6 +50,7 @@ import static org.mockito.Mockito.times; * Tests for {@link BatchDataMongoAutoConfiguration}. * * @author Stephane Nicoll + * @author Yanming Zhou */ class BatchDataMongoAutoConfigurationTests { @@ -69,7 +71,7 @@ class BatchDataMongoAutoConfigurationTests { } @Test - void autConfigurationUsesMainTransactionManager() { + void autConfigurationUsesMainMongoTransactionManager() { MongoTransactionManager transactionManager = mock(MongoTransactionManager.class); this.contextRunner.withBean(MongoDatabaseFactory.class, this::mockMongoDatabaseFactory) .withBean(MongoTransactionManager.class, () -> transactionManager) @@ -79,11 +81,21 @@ class BatchDataMongoAutoConfigurationTests { } @Test - void autConfigurationFavorsBatchTransactionManager() { + void autConfigurationUsesMainPlatformTransactionManager() { + PlatformTransactionManager transactionManager = mock(PlatformTransactionManager.class); + this.contextRunner.withBean(MongoDatabaseFactory.class, this::mockMongoDatabaseFactory) + .withBean(PlatformTransactionManager.class, () -> transactionManager) + .run((context) -> assertThat( + context.getBean(SpringBootBatchMongoConfiguration.class).getTransactionManager()) + .isSameAs(transactionManager)); + } + + @Test + void autConfigurationFavorsBatchMongoTransactionManager() { MongoTransactionManager transactionManager = mock(MongoTransactionManager.class); this.contextRunner.withBean(MongoDatabaseFactory.class, this::mockMongoDatabaseFactory) .withBean(MongoTransactionManager.class, () -> transactionManager) - .withUserConfiguration(BatchTransactionManagerConfiguration.class) + .withUserConfiguration(BatchMongoTransactionManagerConfiguration.class) .run((context) -> { assertThat(context.getBeansOfType(MongoTransactionManager.class)).hasSize(2); assertThat(context.getBean(SpringBootBatchMongoConfiguration.class).getTransactionManager()) @@ -91,14 +103,28 @@ class BatchDataMongoAutoConfigurationTests { }); } + @Test + void autConfigurationFavorsBatchPlatformTransactionManager() { + PlatformTransactionManager transactionManager = mock(PlatformTransactionManager.class); + this.contextRunner.withBean(MongoDatabaseFactory.class, this::mockMongoDatabaseFactory) + .withBean(PlatformTransactionManager.class, () -> transactionManager) + .withUserConfiguration(BatchPlatformTransactionManagerConfiguration.class) + .run((context) -> { + assertThat(context.getBeansOfType(PlatformTransactionManager.class)).hasSize(2); + assertThat(context.getBean(SpringBootBatchMongoConfiguration.class).getTransactionManager()) + .isSameAs(context.getBean("customTransactionManager")); + }); + } + @Test void autConfigurationCreatesBatchTransactionManagerIfNecessary() { MongoDatabaseFactory mongoDatabaseFactory = mockMongoDatabaseFactory(); this.contextRunner.withBean(MongoDatabaseFactory.class, () -> mongoDatabaseFactory).run((context) -> { assertThat(context).doesNotHaveBean(MongoTransactionManager.class); assertThat(context.getBean(SpringBootBatchMongoConfiguration.class).getTransactionManager()) - .satisfies((mongoTransactionManager) -> assertThat(mongoTransactionManager.getDatabaseFactory()) - .isSameAs(mongoDatabaseFactory)); + .isInstanceOfSatisfying(MongoTransactionManager.class, + (mongoTransactionManager) -> assertThat(mongoTransactionManager.getDatabaseFactory()) + .isSameAs(mongoDatabaseFactory)); }); } @@ -197,7 +223,7 @@ class BatchDataMongoAutoConfigurationTests { } @Configuration(proxyBeanMethods = false) - static class BatchTransactionManagerConfiguration { + static class BatchMongoTransactionManagerConfiguration { @Bean @BatchTransactionManager @@ -207,4 +233,15 @@ class BatchDataMongoAutoConfigurationTests { } + @Configuration(proxyBeanMethods = false) + static class BatchPlatformTransactionManagerConfiguration { + + @Bean + @BatchTransactionManager + PlatformTransactionManager customTransactionManager() { + return mock(PlatformTransactionManager.class); + } + + } + }