From f604f99cf3fdf2fea7deb7782ebbda6c9b33cd0c Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 14 Oct 2025 11:57:41 +0200 Subject: [PATCH] Prevent AOT code generation for Reactive repositories. Closes: #5068 --- .../aot/AotMongoRepositoryPostProcessor.java | 4 +++ ...MongoRepositoryPostProcessorUnitTests.java | 32 +++++++++++++++++-- ...activeAotContributionIntegrationTests.java | 14 ++++---- 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/AotMongoRepositoryPostProcessor.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/AotMongoRepositoryPostProcessor.java index 0008edbd7..4515bdb9b 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/AotMongoRepositoryPostProcessor.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/AotMongoRepositoryPostProcessor.java @@ -55,6 +55,10 @@ public class AotMongoRepositoryPostProcessor extends RepositoryRegistrationAotPr return null; } + if(repositoryContext.getRepositoryInformation().isReactiveRepository()) { + return null; + } + return new MongoRepositoryContributor(repositoryContext); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/aot/AotMongoRepositoryPostProcessorUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/aot/AotMongoRepositoryPostProcessorUnitTests.java index 0b347774e..9c7305f19 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/aot/AotMongoRepositoryPostProcessorUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/aot/AotMongoRepositoryPostProcessorUnitTests.java @@ -38,7 +38,9 @@ import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.annotation.MergedAnnotation; import org.springframework.data.annotation.Id; import org.springframework.data.aot.AotContext; +import org.springframework.data.mongodb.repository.ReactivePersonRepository; import org.springframework.data.mongodb.repository.support.SimpleMongoRepository; +import org.springframework.data.mongodb.repository.support.SimpleReactiveMongoRepository; import org.springframework.data.repository.Repository; import org.springframework.data.repository.config.AotRepositoryContextSupport; import org.springframework.data.repository.config.AotRepositoryInformation; @@ -102,13 +104,32 @@ class AotMongoRepositoryPostProcessorUnitTests { assertThat(contributor).isNull(); } + @Test // GH-5068 + void shouldNotAttemptToContributeCodeForReactiveRepository(){ + + GenericApplicationContext context = new GenericApplicationContext(); + context.refresh(); + + MongoRepositoryContributor contributor = createContributorForReactiveRepo(context); + + assertThat(contributor).isNull(); + } + private GenerationContext createGenerationContext() { return new DefaultGenerationContext(new ClassNameGenerator(ClassName.OBJECT), new InMemoryGeneratedFiles()); } + private MongoRepositoryContributor createContributorForReactiveRepo(GenericApplicationContext context) { + return createContributorWithPersonTypes(context, true); + } + private MongoRepositoryContributor createContributorWithPersonTypes(GenericApplicationContext context) { + return createContributorWithPersonTypes(context, false); + } - return new AotMongoRepositoryPostProcessor().contributeAotRepository(new DummyAotRepositoryContext(context) { + private MongoRepositoryContributor createContributorWithPersonTypes(GenericApplicationContext context, boolean reactive) { + + return new AotMongoRepositoryPostProcessor().contributeAotRepository(new DummyAotRepositoryContext(context, reactive) { @Override public Set> getResolvedTypes() { return Collections.singleton(Person.class); @@ -125,8 +146,11 @@ class AotMongoRepositoryPostProcessorUnitTests { static class DummyAotRepositoryContext extends AotRepositoryContextSupport { - DummyAotRepositoryContext(AbstractApplicationContext applicationContext) { + boolean reactive; + + DummyAotRepositoryContext(AbstractApplicationContext applicationContext, boolean reactive) { super(AotContext.from(applicationContext, applicationContext.getEnvironment())); + this.reactive = reactive; } @Override @@ -151,6 +175,10 @@ class AotMongoRepositoryPostProcessorUnitTests { @Override public RepositoryInformation getRepositoryInformation() { + if(reactive) { + return new AotRepositoryInformation(AbstractRepositoryMetadata.getMetadata(ReactivePersonRepository.class), + SimpleReactiveMongoRepository.class, List.of()); + } return new AotRepositoryInformation(AbstractRepositoryMetadata.getMetadata(PersonRepository.class), SimpleMongoRepository.class, List.of()); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/aot/ReactiveAotContributionIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/aot/ReactiveAotContributionIntegrationTests.java index 62561f6f2..a23c67efe 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/aot/ReactiveAotContributionIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/aot/ReactiveAotContributionIntegrationTests.java @@ -18,7 +18,11 @@ package org.springframework.data.mongodb.repository.aot; import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson; import static org.mockito.Mockito.mock; +import com.mongodb.reactivestreams.client.MongoClient; import example.aot.User; +import org.junit.jupiter.api.Disabled; +import org.springframework.data.mongodb.config.AbstractReactiveMongoConfiguration; +import org.springframework.data.repository.reactive.ReactiveCrudRepository; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -35,13 +39,10 @@ import org.springframework.context.aot.ApplicationContextAotGenerator; import org.springframework.core.io.InputStreamResource; import org.springframework.core.io.InputStreamSource; import org.springframework.data.aot.AotContext; -import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration; import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories; import org.springframework.data.querydsl.ReactiveQuerydslPredicateExecutor; -import org.springframework.data.repository.CrudRepository; import org.springframework.mock.env.MockPropertySource; -import com.mongodb.client.MongoClient; /** * Integration tests for AOT processing of reactive repositories. @@ -52,10 +53,10 @@ class ReactiveAotContributionIntegrationTests { @EnableReactiveMongoRepositories(considerNestedRepositories = true, includeFilters = { @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ReactiveQuerydslUserRepository.class) }) - static class AotConfiguration extends AbstractMongoClientConfiguration { + static class AotConfiguration extends AbstractReactiveMongoConfiguration { @Override - public MongoClient mongoClient() { + public MongoClient reactiveMongoClient() { return mock(MongoClient.class); } @@ -66,7 +67,7 @@ class ReactiveAotContributionIntegrationTests { } interface ReactiveQuerydslUserRepository - extends CrudRepository, ReactiveQuerydslPredicateExecutor { + extends ReactiveCrudRepository, ReactiveQuerydslPredicateExecutor { Flux findUserNoArgumentsBy(); @@ -75,6 +76,7 @@ class ReactiveAotContributionIntegrationTests { } @Test // GH-4964 + @Disabled("GH-5068: creates a ReactiveQuerydslUserRepositoryImpl__AotRepository referencing imperative template etc.") void shouldGenerateMetadataForBaseRepositoryAndQuerydslFragment() throws IOException { TestGenerationContext generationContext = generate(AotConfiguration.class);