diff --git a/src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java b/src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java index 48f2d42f9..8b97f82f9 100644 --- a/src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java +++ b/src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.Optional; import java.util.Set; import java.util.function.Function; +import java.util.function.Predicate; import java.util.stream.Stream; import org.jspecify.annotations.NonNull; @@ -195,7 +196,11 @@ public class AnnotationRepositoryConfigurationSource extends RepositoryConfigura return Optional.empty(); } - return Optional.of(attributes.getClass(REPOSITORY_FRAGMENTS_CONTRIBUTOR_CLASS).getName()); + Class fragmentsContributorClass = attributes.getClass(REPOSITORY_FRAGMENTS_CONTRIBUTOR_CLASS); + + return Optional.of(fragmentsContributorClass) // + .filter(Predicate.not(Class::isInterface)) // avoid default values that are typically interfaces + .map(Class::getName); } /** diff --git a/src/test/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSourceUnitTests.java b/src/test/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSourceUnitTests.java index ff9a96bbc..f5d3418a9 100755 --- a/src/test/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSourceUnitTests.java +++ b/src/test/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSourceUnitTests.java @@ -38,6 +38,7 @@ import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.data.repository.config.basepackage.repo.PersonRepository; import org.springframework.data.repository.core.support.DummyReactiveRepositoryFactory; import org.springframework.data.repository.core.support.DummyRepositoryFactory; +import org.springframework.data.repository.core.support.RepositoryFragmentsContributor; import org.springframework.data.repository.reactive.ReactiveCrudRepository; /** @@ -196,6 +197,19 @@ class AnnotationRepositoryConfigurationSourceUnitTests { .contains(SampleRepositoryFragmentsContributor.class.getName()); } + @Test // GH-3279 + void skipsInterfaceFragmentsContributor() { + + RootBeanDefinition bd = new RootBeanDefinition(DummyRepositoryFactory.class); + bd.getConstructorArgumentValues().addGenericArgumentValue(PersonRepository.class); + + AnnotationMetadata metadata = AnnotationMetadata.introspect(ConfigurationWithFragmentsContributorInterface.class); + AnnotationRepositoryConfigurationSource configurationSource = new AnnotationRepositoryConfigurationSource(metadata, + EnableRepositoriesWithContributor.class, resourceLoader, environment, registry, null); + + assertThat(configurationSource.getRepositoryFragmentsContributorClassName()).isEmpty(); + } + @Test // GH-3279 void omitsUnspecifiedFragmentsContributor() { @@ -216,8 +230,9 @@ class AnnotationRepositoryConfigurationSourceUnitTests { bd.getConstructorArgumentValues().addGenericArgumentValue(ReactivePersonRepository.class); assertThat(getConfigSource(ConfigurationWithBeanNameGenerator.class).generateBeanName(bd)) - .isEqualTo(ReactivePersonRepository.class.getName()); - assertThat(getConfigSource(DefaultConfiguration.class).generateBeanName(bd)).isEqualTo("annotationRepositoryConfigurationSourceUnitTests.ReactivePersonRepository"); + .isEqualTo(ReactivePersonRepository.class.getName()); + assertThat(getConfigSource(DefaultConfiguration.class).generateBeanName(bd)) + .isEqualTo("annotationRepositoryConfigurationSourceUnitTests.ReactivePersonRepository"); } private AnnotationRepositoryConfigurationSource getConfigSource(Class type) { @@ -247,6 +262,9 @@ class AnnotationRepositoryConfigurationSourceUnitTests { @EnableRepositoriesWithContributor() static class ConfigurationWithFragmentsContributor {} + @EnableRepositoriesWithContributor(fragmentsContributor = RepositoryFragmentsContributor.class) + static class ConfigurationWithFragmentsContributorInterface {} + @EnableReactiveRepositories(nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class) static class ReactiveConfigurationWithBeanNameGenerator {} @@ -256,6 +274,7 @@ class AnnotationRepositoryConfigurationSourceUnitTests { Filter[] includeFilters() default {}; Filter[] excludeFilters() default {}; + } @SampleAnnotation