From ec3ba10954e7fab4b5f20c0c0f8f36e75cc1f1dd Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Wed, 26 Jun 2024 10:50:19 +0200 Subject: [PATCH] Polishing. Delegate annotation attribute resolution to configured BeanNameGenerator resolving method and test for enabling reactive repositories. Original Pull Request: #3083 --- ...notationRepositoryConfigurationSource.java | 30 +++++++++---------- ...epositoryConfigurationSourceUnitTests.java | 24 +++++++++++++-- .../config/EnableReactiveRepositories.java | 3 ++ ...anDefinitionRegistrarSupportUnitTests.java | 4 +-- 4 files changed, 42 insertions(+), 19 deletions(-) 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 7d042d1b1..f85a54662 100644 --- a/src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java +++ b/src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java @@ -53,6 +53,7 @@ import org.springframework.util.StringUtils; * @author Mark Paluch * @author Johannes Englmeier * @author Florian Cramer + * @author Christoph Strobl */ public class AnnotationRepositoryConfigurationSource extends RepositoryConfigurationSourceSupport { @@ -314,15 +315,10 @@ public class AnnotationRepositoryConfigurationSource extends RepositoryConfigura Class annotation, ClassLoader beanClassLoader, @Nullable BeanNameGenerator importBeanNameGenerator) { - Map annotationAttributes = metadata.getAnnotationAttributes(annotation.getName()); - - if (annotationAttributes != null) { - - BeanNameGenerator beanNameGenerator = getBeanNameGenerator(annotationAttributes, beanClassLoader); + BeanNameGenerator beanNameGenerator = getConfiguredBeanNameGenerator(metadata, annotation, beanClassLoader); - if (beanNameGenerator != null) { - return beanNameGenerator; - } + if (beanNameGenerator != null) { + return beanNameGenerator; } return defaultBeanNameGenerator(importBeanNameGenerator); @@ -348,26 +344,30 @@ public class AnnotationRepositoryConfigurationSource extends RepositoryConfigura } /** - * Obtain a configured {@link BeanNameGenerator}. + * Obtain a configured {@link BeanNameGenerator} if present. * * @param beanClassLoader a class loader to load the configured {@link BeanNameGenerator} class in case it was * configured as String instead of a Class instance. - * @return the bean name generator. + * @return the bean name generator or {@literal null} if not configured. */ @Nullable @SuppressWarnings("unchecked") - private static BeanNameGenerator getBeanNameGenerator(Map annotationAttributes, - ClassLoader beanClassLoader) { + private static BeanNameGenerator getConfiguredBeanNameGenerator(AnnotationMetadata metadata, + Class annotation, ClassLoader beanClassLoader) { - Object configuredBeanNameGenerator = annotationAttributes.get(BEAN_NAME_GENERATOR); + Map annotationAttributes = metadata.getAnnotationAttributes(annotation.getName()); + if(annotationAttributes == null || !annotationAttributes.containsKey(BEAN_NAME_GENERATOR)) { + return null; + } + Object configuredBeanNameGenerator = annotationAttributes.get(BEAN_NAME_GENERATOR); if (configuredBeanNameGenerator == null) { return null; } - if (configuredBeanNameGenerator instanceof String cbng) { + if (configuredBeanNameGenerator instanceof String beanNameGeneratorTypeName) { try { - configuredBeanNameGenerator = ClassUtils.forName(cbng, beanClassLoader); + configuredBeanNameGenerator = ClassUtils.forName(beanNameGeneratorTypeName, beanClassLoader); } catch (Exception o_O) { throw new RuntimeException(o_O); } 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 bef1116d9..1f1cf79c9 100755 --- a/src/test/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSourceUnitTests.java +++ b/src/test/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSourceUnitTests.java @@ -15,8 +15,9 @@ */ package org.springframework.data.repository.config; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.mockito.Mockito.mock; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -36,7 +37,9 @@ import org.springframework.core.type.AnnotationMetadata; import org.springframework.core.type.StandardAnnotationMetadata; 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.reactive.ReactiveCrudRepository; /** * Unit tests for {@link AnnotationRepositoryConfigurationSource}. @@ -44,6 +47,7 @@ import org.springframework.data.repository.core.support.DummyRepositoryFactory; * @author Oliver Gierke * @author Thomas Darimont * @author Mark Paluch + * @author Christoph Strobl */ class AnnotationRepositoryConfigurationSourceUnitTests { @@ -180,6 +184,17 @@ class AnnotationRepositoryConfigurationSourceUnitTests { assertThat(getConfigSource(DefaultConfiguration.class).generateBeanName(bd)).isEqualTo("personRepository"); } + @Test // GH-3082 + void considerBeanNameGeneratorForReactiveRepos() { + + RootBeanDefinition bd = new RootBeanDefinition(DummyReactiveRepositoryFactory.class); + bd.getConstructorArgumentValues().addGenericArgumentValue(ReactivePersonRepository.class); + + assertThat(getConfigSource(ConfigurationWithBeanNameGenerator.class).generateBeanName(bd)) + .isEqualTo(ReactivePersonRepository.class.getName()); + assertThat(getConfigSource(DefaultConfiguration.class).generateBeanName(bd)).isEqualTo("annotationRepositoryConfigurationSourceUnitTests.ReactivePersonRepository"); + } + private AnnotationRepositoryConfigurationSource getConfigSource(Class type) { AnnotationMetadata metadata = new StandardAnnotationMetadata(type, true); @@ -204,6 +219,9 @@ class AnnotationRepositoryConfigurationSourceUnitTests { @EnableRepositories(nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class) static class ConfigurationWithBeanNameGenerator {} + @EnableReactiveRepositories(nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class) + static class ReactiveConfigurationWithBeanNameGenerator {} + @Retention(RetentionPolicy.RUNTIME) @interface SampleAnnotation { @@ -214,4 +232,6 @@ class AnnotationRepositoryConfigurationSourceUnitTests { @SampleAnnotation static class ConfigWithSampleAnnotation {} + + interface ReactivePersonRepository extends ReactiveCrudRepository {} } diff --git a/src/test/java/org/springframework/data/repository/config/EnableReactiveRepositories.java b/src/test/java/org/springframework/data/repository/config/EnableReactiveRepositories.java index 19890b1ba..7f40760bd 100644 --- a/src/test/java/org/springframework/data/repository/config/EnableReactiveRepositories.java +++ b/src/test/java/org/springframework/data/repository/config/EnableReactiveRepositories.java @@ -19,6 +19,7 @@ import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import org.springframework.beans.factory.support.BeanNameGenerator; import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.Import; import org.springframework.data.repository.core.support.ReactiveDummyRepositoryFactoryBean; @@ -43,6 +44,8 @@ public @interface EnableReactiveRepositories { Class repositoryBaseClass() default ReactiveSortingRepository.class; + Class nameGenerator() default BeanNameGenerator.class; + String namedQueriesLocation() default ""; String repositoryImplementationPostfix() default "Impl"; diff --git a/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java b/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java index 2d015633a..7dd94aa72 100755 --- a/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java +++ b/src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java @@ -77,7 +77,6 @@ class RepositoryBeanDefinitionRegistrarSupportUnitTests { assertNoBeanDefinitionRegisteredFor("profileRepository"); } - @Test // GH-2584 void shouldExposeFragmentsAsBean() { @@ -202,7 +201,8 @@ class RepositoryBeanDefinitionRegistrarSupportUnitTests { @EnableRepositories(basePackageClasses = MyNestedRepository.class, considerNestedRepositories = true, excludeFilters = { @Filter(type = FilterType.ASSIGNABLE_TYPE, - value = RepositoryConfigurationExtensionSupportUnitTests.ReactiveRepository.class), + value = { RepositoryConfigurationExtensionSupportUnitTests.ReactiveRepository.class, + AnnotationRepositoryConfigurationSourceUnitTests.ReactivePersonRepository.class }), @Filter(type = FilterType.ASSIGNABLE_TYPE, value = MyOtherRepository.class) }) static class NestedRepositoriesConfiguration {}