Browse Source

Prevent AOT code generation for Reactive repositories.

Closes: #5068
pull/5073/head
Christoph Strobl 2 months ago
parent
commit
f604f99cf3
No known key found for this signature in database
GPG Key ID: E6054036D0C37A4B
  1. 4
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/aot/AotMongoRepositoryPostProcessor.java
  2. 32
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/aot/AotMongoRepositoryPostProcessorUnitTests.java
  3. 14
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/aot/ReactiveAotContributionIntegrationTests.java

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

@ -55,6 +55,10 @@ public class AotMongoRepositoryPostProcessor extends RepositoryRegistrationAotPr @@ -55,6 +55,10 @@ public class AotMongoRepositoryPostProcessor extends RepositoryRegistrationAotPr
return null;
}
if(repositoryContext.getRepositoryInformation().isReactiveRepository()) {
return null;
}
return new MongoRepositoryContributor(repositoryContext);
}

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

@ -38,7 +38,9 @@ import org.springframework.context.support.GenericApplicationContext; @@ -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 { @@ -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<Class<?>> getResolvedTypes() {
return Collections.singleton(Person.class);
@ -125,8 +146,11 @@ class AotMongoRepositoryPostProcessorUnitTests { @@ -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 { @@ -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());
}

14
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; @@ -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; @@ -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 { @@ -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 { @@ -66,7 +67,7 @@ class ReactiveAotContributionIntegrationTests {
}
interface ReactiveQuerydslUserRepository
extends CrudRepository<User, String>, ReactiveQuerydslPredicateExecutor<User> {
extends ReactiveCrudRepository<User, String>, ReactiveQuerydslPredicateExecutor<User> {
Flux<User> findUserNoArgumentsBy();
@ -75,6 +76,7 @@ class ReactiveAotContributionIntegrationTests { @@ -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);

Loading…
Cancel
Save