Skip to content

Commit d4ba55f

Browse files
committed
Do not configure a ReactiveNeo4jTransactionManager
The current arrangement with Neo4j does not allow us to know for sure that the user intends to use `@Transactional` for reactive or imperative operations. The main reason for that is that the only trigger for the reactive auto-configuration is the presence of reactor on the classpath given that the Neo4j driver ships with both styles in the same jar. And reactor can be on the classpath for a number of reasons that are unrelated to imperative access (typically `WebClient`). This commits removes the auto-configuration of the ReactiveNeo4jAutoConfiguration and makes sure that if the user defines one, the regular `PlatformTransactionManager` backs off. This is a temporarily situation until we can provide a better signal that the user intends to primarily use imperative repositories. Closes gh-22940
1 parent 4398c71 commit d4ba55f

File tree

5 files changed

+18
-28
lines changed

5 files changed

+18
-28
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfiguration.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.springframework.data.neo4j.core.transaction.Neo4jTransactionManager;
4848
import org.springframework.data.neo4j.repository.config.Neo4jRepositoryConfigurationExtension;
4949
import org.springframework.transaction.PlatformTransactionManager;
50+
import org.springframework.transaction.TransactionManager;
5051

5152
/**
5253
* {@link EnableAutoConfiguration Auto-configuration} for Spring Data Neo4j.
@@ -106,7 +107,7 @@ public Neo4jTemplate neo4jTemplate(Neo4jClient neo4jClient, Neo4jMappingContext
106107
}
107108

108109
@Bean(Neo4jRepositoryConfigurationExtension.DEFAULT_TRANSACTION_MANAGER_BEAN_NAME)
109-
@ConditionalOnMissingBean(PlatformTransactionManager.class)
110+
@ConditionalOnMissingBean(TransactionManager.class)
110111
public Neo4jTransactionManager transactionManager(Driver driver, DatabaseSelectionProvider databaseNameProvider,
111112
ObjectProvider<TransactionManagerCustomizers> optionalCustomizers) {
112113
Neo4jTransactionManager transactionManager = new Neo4jTransactionManager(driver, databaseNameProvider);

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jReactiveDataAutoConfiguration.java

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import org.springframework.data.neo4j.core.ReactiveNeo4jOperations;
3434
import org.springframework.data.neo4j.core.ReactiveNeo4jTemplate;
3535
import org.springframework.data.neo4j.core.mapping.Neo4jMappingContext;
36-
import org.springframework.data.neo4j.core.transaction.ReactiveNeo4jTransactionManager;
3736
import org.springframework.data.neo4j.repository.config.ReactiveNeo4jRepositoryConfigurationExtension;
3837
import org.springframework.transaction.ReactiveTransactionManager;
3938

@@ -46,8 +45,7 @@
4645
* @since 2.4.0
4746
*/
4847
@Configuration(proxyBeanMethods = false)
49-
@ConditionalOnClass({ Driver.class, ReactiveNeo4jTransactionManager.class, ReactiveTransactionManager.class,
50-
Flux.class })
48+
@ConditionalOnClass({ Driver.class, ReactiveNeo4jTemplate.class, ReactiveTransactionManager.class, Flux.class })
5149
@ConditionalOnBean(Driver.class)
5250
@AutoConfigureAfter(Neo4jDataAutoConfiguration.class)
5351
@Import(Neo4jDefaultReactiveCallbacksRegistrar.class)
@@ -74,11 +72,4 @@ public ReactiveNeo4jTemplate reactiveNeo4jTemplate(ReactiveNeo4jClient neo4jClie
7472
return new ReactiveNeo4jTemplate(neo4jClient, neo4jMappingContext, databaseNameProvider);
7573
}
7674

77-
@Bean(ReactiveNeo4jRepositoryConfigurationExtension.DEFAULT_TRANSACTION_MANAGER_BEAN_NAME)
78-
@ConditionalOnMissingBean(ReactiveTransactionManager.class)
79-
public ReactiveTransactionManager reactiveTransactionManager(Driver driver,
80-
ReactiveDatabaseSelectionProvider databaseNameProvider) {
81-
return new ReactiveNeo4jTransactionManager(driver, databaseNameProvider);
82-
}
83-
8475
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jDataAutoConfigurationTests.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131
import org.springframework.data.neo4j.core.convert.Neo4jConversions;
3232
import org.springframework.data.neo4j.core.transaction.Neo4jTransactionManager;
3333
import org.springframework.transaction.PlatformTransactionManager;
34+
import org.springframework.transaction.ReactiveTransactionManager;
35+
import org.springframework.transaction.TransactionManager;
3436

3537
import static org.assertj.core.api.Assertions.assertThat;
3638
import static org.mockito.Mockito.mock;
@@ -119,6 +121,13 @@ void shouldProvideTransactionManager() {
119121
});
120122
}
121123

124+
@Test
125+
void shouldBackoffIfReactiveTransactionManagerIsSet() {
126+
this.contextRunner.withBean(ReactiveTransactionManager.class, () -> mock(ReactiveTransactionManager.class))
127+
.run((context) -> assertThat(context).doesNotHaveBean(Neo4jTransactionManager.class)
128+
.hasSingleBean(TransactionManager.class));
129+
}
130+
122131
@Test
123132
void shouldReuseExistingTransactionManager() {
124133
this.contextRunner

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jReactiveDataAutoConfigurationTests.java

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
import org.springframework.data.neo4j.core.ReactiveNeo4jClient;
3131
import org.springframework.data.neo4j.core.ReactiveNeo4jOperations;
3232
import org.springframework.data.neo4j.core.ReactiveNeo4jTemplate;
33-
import org.springframework.data.neo4j.core.transaction.ReactiveNeo4jTransactionManager;
3433
import org.springframework.transaction.ReactiveTransactionManager;
34+
import org.springframework.transaction.TransactionManager;
3535

3636
import static org.assertj.core.api.Assertions.assertThat;
3737
import static org.mockito.Mockito.mock;
@@ -113,23 +113,12 @@ void shouldReuseExistingReactiveNeo4jTemplate() {
113113
}
114114

115115
@Test
116-
void shouldProvideReactiveTransactionManager() {
117-
this.contextRunner.withUserConfiguration(CustomReactiveDatabaseSelectionProviderConfiguration.class)
118-
.run((context) -> {
119-
assertThat(context).hasSingleBean(ReactiveNeo4jTransactionManager.class);
120-
assertThat(context.getBean(ReactiveNeo4jTransactionManager.class))
121-
.extracting("databaseSelectionProvider")
122-
.isSameAs(context.getBean(ReactiveDatabaseSelectionProvider.class));
123-
});
124-
}
125-
126-
@Test
127-
void shouldReuseExistingReactiveTransactionManager() {
116+
void shouldUseExistingReactiveTransactionManager() {
128117
this.contextRunner
129118
.withBean("myCustomReactiveTransactionManager", ReactiveTransactionManager.class,
130119
() -> mock(ReactiveTransactionManager.class))
131120
.run((context) -> assertThat(context).hasSingleBean(ReactiveTransactionManager.class)
132-
.hasBean("myCustomReactiveTransactionManager"));
121+
.hasSingleBean(TransactionManager.class));
133122
}
134123

135124
@Configuration(proxyBeanMethods = false)

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/neo4j/Neo4jReactiveRepositoriesAutoConfigurationTests.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import org.springframework.boot.autoconfigure.data.neo4j.country.ReactiveCountryRepository;
2929
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3030
import org.springframework.context.annotation.Configuration;
31-
import org.springframework.data.neo4j.core.transaction.ReactiveNeo4jTransactionManager;
31+
import org.springframework.data.neo4j.core.ReactiveNeo4jTemplate;
3232
import org.springframework.data.neo4j.repository.ReactiveNeo4jRepository;
3333
import org.springframework.data.neo4j.repository.config.EnableReactiveNeo4jRepositories;
3434

@@ -57,7 +57,7 @@ void configurationWithDefaultRepositories() {
5757
@Test
5858
void configurationWithNoRepositories() {
5959
this.contextRunner.withUserConfiguration(EmptyConfiguration.class).run((context) -> assertThat(context)
60-
.hasSingleBean(ReactiveNeo4jTransactionManager.class).doesNotHaveBean(ReactiveNeo4jRepository.class));
60+
.hasSingleBean(ReactiveNeo4jTemplate.class).doesNotHaveBean(ReactiveNeo4jRepository.class));
6161
}
6262

6363
@Test
@@ -70,7 +70,7 @@ void configurationWithDisabledRepositories() {
7070
@Test
7171
void autoConfigurationShouldNotKickInEvenIfManualConfigDidNotCreateAnyRepositories() {
7272
this.contextRunner.withUserConfiguration(SortOfInvalidCustomConfiguration.class)
73-
.run((context) -> assertThat(context).hasSingleBean(ReactiveNeo4jTransactionManager.class)
73+
.run((context) -> assertThat(context).hasSingleBean(ReactiveNeo4jTemplate.class)
7474
.doesNotHaveBean(ReactiveNeo4jRepository.class));
7575
}
7676

0 commit comments

Comments
 (0)