Skip to content

Commit f604f99

Browse files
Prevent AOT code generation for Reactive repositories.
Closes: #5068
1 parent f9a1a62 commit f604f99

File tree

3 files changed

+42
-8
lines changed

3 files changed

+42
-8
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/AotMongoRepositoryPostProcessor.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,10 @@ protected void configureTypeContributions(AotRepositoryContext repositoryContext
5555
return null;
5656
}
5757

58+
if(repositoryContext.getRepositoryInformation().isReactiveRepository()) {
59+
return null;
60+
}
61+
5862
return new MongoRepositoryContributor(repositoryContext);
5963
}
6064

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/aot/AotMongoRepositoryPostProcessorUnitTests.java

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,9 @@
3838
import org.springframework.core.annotation.MergedAnnotation;
3939
import org.springframework.data.annotation.Id;
4040
import org.springframework.data.aot.AotContext;
41+
import org.springframework.data.mongodb.repository.ReactivePersonRepository;
4142
import org.springframework.data.mongodb.repository.support.SimpleMongoRepository;
43+
import org.springframework.data.mongodb.repository.support.SimpleReactiveMongoRepository;
4244
import org.springframework.data.repository.Repository;
4345
import org.springframework.data.repository.config.AotRepositoryContextSupport;
4446
import org.springframework.data.repository.config.AotRepositoryInformation;
@@ -102,13 +104,32 @@ void shouldDisableAotRepositoriesWhenJpaGeneratedRepositoriesIsFalse() {
102104
assertThat(contributor).isNull();
103105
}
104106

107+
@Test // GH-5068
108+
void shouldNotAttemptToContributeCodeForReactiveRepository(){
109+
110+
GenericApplicationContext context = new GenericApplicationContext();
111+
context.refresh();
112+
113+
MongoRepositoryContributor contributor = createContributorForReactiveRepo(context);
114+
115+
assertThat(contributor).isNull();
116+
}
117+
105118
private GenerationContext createGenerationContext() {
106119
return new DefaultGenerationContext(new ClassNameGenerator(ClassName.OBJECT), new InMemoryGeneratedFiles());
107120
}
108121

122+
private MongoRepositoryContributor createContributorForReactiveRepo(GenericApplicationContext context) {
123+
return createContributorWithPersonTypes(context, true);
124+
}
125+
109126
private MongoRepositoryContributor createContributorWithPersonTypes(GenericApplicationContext context) {
127+
return createContributorWithPersonTypes(context, false);
128+
}
110129

111-
return new AotMongoRepositoryPostProcessor().contributeAotRepository(new DummyAotRepositoryContext(context) {
130+
private MongoRepositoryContributor createContributorWithPersonTypes(GenericApplicationContext context, boolean reactive) {
131+
132+
return new AotMongoRepositoryPostProcessor().contributeAotRepository(new DummyAotRepositoryContext(context, reactive) {
112133
@Override
113134
public Set<Class<?>> getResolvedTypes() {
114135
return Collections.singleton(Person.class);
@@ -125,8 +146,11 @@ interface PersonRepository extends Repository<Person, Long> {}
125146

126147
static class DummyAotRepositoryContext extends AotRepositoryContextSupport {
127148

128-
DummyAotRepositoryContext(AbstractApplicationContext applicationContext) {
149+
boolean reactive;
150+
151+
DummyAotRepositoryContext(AbstractApplicationContext applicationContext, boolean reactive) {
129152
super(AotContext.from(applicationContext, applicationContext.getEnvironment()));
153+
this.reactive = reactive;
130154
}
131155

132156
@Override
@@ -151,6 +175,10 @@ public Set<Class<? extends Annotation>> getIdentifyingAnnotations() {
151175

152176
@Override
153177
public RepositoryInformation getRepositoryInformation() {
178+
if(reactive) {
179+
return new AotRepositoryInformation(AbstractRepositoryMetadata.getMetadata(ReactivePersonRepository.class),
180+
SimpleReactiveMongoRepository.class, List.of());
181+
}
154182
return new AotRepositoryInformation(AbstractRepositoryMetadata.getMetadata(PersonRepository.class),
155183
SimpleMongoRepository.class, List.of());
156184
}

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/aot/ReactiveAotContributionIntegrationTests.java

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@
1818
import static net.javacrumbs.jsonunit.assertj.JsonAssertions.assertThatJson;
1919
import static org.mockito.Mockito.mock;
2020

21+
import com.mongodb.reactivestreams.client.MongoClient;
2122
import example.aot.User;
23+
import org.junit.jupiter.api.Disabled;
24+
import org.springframework.data.mongodb.config.AbstractReactiveMongoConfiguration;
25+
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
2226
import reactor.core.publisher.Flux;
2327
import reactor.core.publisher.Mono;
2428

@@ -35,13 +39,10 @@
3539
import org.springframework.core.io.InputStreamResource;
3640
import org.springframework.core.io.InputStreamSource;
3741
import org.springframework.data.aot.AotContext;
38-
import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration;
3942
import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories;
4043
import org.springframework.data.querydsl.ReactiveQuerydslPredicateExecutor;
41-
import org.springframework.data.repository.CrudRepository;
4244
import org.springframework.mock.env.MockPropertySource;
4345

44-
import com.mongodb.client.MongoClient;
4546

4647
/**
4748
* Integration tests for AOT processing of reactive repositories.
@@ -52,10 +53,10 @@ class ReactiveAotContributionIntegrationTests {
5253

5354
@EnableReactiveMongoRepositories(considerNestedRepositories = true, includeFilters = {
5455
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ReactiveQuerydslUserRepository.class) })
55-
static class AotConfiguration extends AbstractMongoClientConfiguration {
56+
static class AotConfiguration extends AbstractReactiveMongoConfiguration {
5657

5758
@Override
58-
public MongoClient mongoClient() {
59+
public MongoClient reactiveMongoClient() {
5960
return mock(MongoClient.class);
6061
}
6162

@@ -66,7 +67,7 @@ protected String getDatabaseName() {
6667
}
6768

6869
interface ReactiveQuerydslUserRepository
69-
extends CrudRepository<User, String>, ReactiveQuerydslPredicateExecutor<User> {
70+
extends ReactiveCrudRepository<User, String>, ReactiveQuerydslPredicateExecutor<User> {
7071

7172
Flux<User> findUserNoArgumentsBy();
7273

@@ -75,6 +76,7 @@ interface ReactiveQuerydslUserRepository
7576
}
7677

7778
@Test // GH-4964
79+
@Disabled("GH-5068: creates a ReactiveQuerydslUserRepositoryImpl__AotRepository referencing imperative template etc.")
7880
void shouldGenerateMetadataForBaseRepositoryAndQuerydslFragment() throws IOException {
7981

8082
TestGenerationContext generationContext = generate(AotConfiguration.class);

0 commit comments

Comments
 (0)