Align use of transaction manager in MongoDB support

See gh-51725

Signed-off-by: Yanming Zhou <zhouyanming@gmail.com>
This commit is contained in:
Yanming Zhou
2026-09-16 19:24:47 +02:00
committed by Stéphane Nicoll
parent 683d41b323
commit f5b8c5a72d
2 changed files with 49 additions and 10 deletions
@@ -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<MongoTransactionManager> transactionManager,
@BatchTransactionManager ObjectProvider<MongoTransactionManager> batchTransactionManager,
ObjectProvider<PlatformTransactionManager> transactionManager,
@BatchTransactionManager ObjectProvider<PlatformTransactionManager> batchTransactionManager,
@BatchTaskExecutor ObjectProvider<TaskExecutor> 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;
}
@@ -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);
}
}
}