Browse Source

Polishing.

Delegate annotation attribute resolution to configured BeanNameGenerator resolving method and test for enabling reactive repositories.

Original Pull Request: #3083
pull/3119/head
Christoph Strobl 2 years ago
parent
commit
ec3ba10954
No known key found for this signature in database
GPG Key ID: E6054036D0C37A4B
  1. 30
      src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java
  2. 24
      src/test/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSourceUnitTests.java
  3. 3
      src/test/java/org/springframework/data/repository/config/EnableReactiveRepositories.java
  4. 4
      src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java

30
src/main/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSource.java

@ -53,6 +53,7 @@ import org.springframework.util.StringUtils;
* @author Mark Paluch * @author Mark Paluch
* @author Johannes Englmeier * @author Johannes Englmeier
* @author Florian Cramer * @author Florian Cramer
* @author Christoph Strobl
*/ */
public class AnnotationRepositoryConfigurationSource extends RepositoryConfigurationSourceSupport { public class AnnotationRepositoryConfigurationSource extends RepositoryConfigurationSourceSupport {
@ -314,15 +315,10 @@ public class AnnotationRepositoryConfigurationSource extends RepositoryConfigura
Class<? extends Annotation> annotation, ClassLoader beanClassLoader, Class<? extends Annotation> annotation, ClassLoader beanClassLoader,
@Nullable BeanNameGenerator importBeanNameGenerator) { @Nullable BeanNameGenerator importBeanNameGenerator) {
Map<String, Object> annotationAttributes = metadata.getAnnotationAttributes(annotation.getName()); BeanNameGenerator beanNameGenerator = getConfiguredBeanNameGenerator(metadata, annotation, beanClassLoader);
if (annotationAttributes != null) {
BeanNameGenerator beanNameGenerator = getBeanNameGenerator(annotationAttributes, beanClassLoader);
if (beanNameGenerator != null) { if (beanNameGenerator != null) {
return beanNameGenerator; return beanNameGenerator;
}
} }
return defaultBeanNameGenerator(importBeanNameGenerator); 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 * @param beanClassLoader a class loader to load the configured {@link BeanNameGenerator} class in case it was
* configured as String instead of a Class instance. * 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 @Nullable
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private static BeanNameGenerator getBeanNameGenerator(Map<String, Object> annotationAttributes, private static BeanNameGenerator getConfiguredBeanNameGenerator(AnnotationMetadata metadata,
ClassLoader beanClassLoader) { Class<? extends Annotation> annotation, ClassLoader beanClassLoader) {
Object configuredBeanNameGenerator = annotationAttributes.get(BEAN_NAME_GENERATOR); Map<String, Object> 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) { if (configuredBeanNameGenerator == null) {
return null; return null;
} }
if (configuredBeanNameGenerator instanceof String cbng) { if (configuredBeanNameGenerator instanceof String beanNameGeneratorTypeName) {
try { try {
configuredBeanNameGenerator = ClassUtils.forName(cbng, beanClassLoader); configuredBeanNameGenerator = ClassUtils.forName(beanNameGeneratorTypeName, beanClassLoader);
} catch (Exception o_O) { } catch (Exception o_O) {
throw new RuntimeException(o_O); throw new RuntimeException(o_O);
} }

24
src/test/java/org/springframework/data/repository/config/AnnotationRepositoryConfigurationSourceUnitTests.java

@ -15,8 +15,9 @@
*/ */
package org.springframework.data.repository.config; package org.springframework.data.repository.config;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.Mockito.*; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
import static org.mockito.Mockito.mock;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
@ -36,7 +37,9 @@ import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.StandardAnnotationMetadata; import org.springframework.core.type.StandardAnnotationMetadata;
import org.springframework.data.repository.PagingAndSortingRepository; import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.config.basepackage.repo.PersonRepository; 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.DummyRepositoryFactory;
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
/** /**
* Unit tests for {@link AnnotationRepositoryConfigurationSource}. * Unit tests for {@link AnnotationRepositoryConfigurationSource}.
@ -44,6 +47,7 @@ import org.springframework.data.repository.core.support.DummyRepositoryFactory;
* @author Oliver Gierke * @author Oliver Gierke
* @author Thomas Darimont * @author Thomas Darimont
* @author Mark Paluch * @author Mark Paluch
* @author Christoph Strobl
*/ */
class AnnotationRepositoryConfigurationSourceUnitTests { class AnnotationRepositoryConfigurationSourceUnitTests {
@ -180,6 +184,17 @@ class AnnotationRepositoryConfigurationSourceUnitTests {
assertThat(getConfigSource(DefaultConfiguration.class).generateBeanName(bd)).isEqualTo("personRepository"); 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) { private AnnotationRepositoryConfigurationSource getConfigSource(Class<?> type) {
AnnotationMetadata metadata = new StandardAnnotationMetadata(type, true); AnnotationMetadata metadata = new StandardAnnotationMetadata(type, true);
@ -204,6 +219,9 @@ class AnnotationRepositoryConfigurationSourceUnitTests {
@EnableRepositories(nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class) @EnableRepositories(nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class)
static class ConfigurationWithBeanNameGenerator {} static class ConfigurationWithBeanNameGenerator {}
@EnableReactiveRepositories(nameGenerator = FullyQualifiedAnnotationBeanNameGenerator.class)
static class ReactiveConfigurationWithBeanNameGenerator {}
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
@interface SampleAnnotation { @interface SampleAnnotation {
@ -214,4 +232,6 @@ class AnnotationRepositoryConfigurationSourceUnitTests {
@SampleAnnotation @SampleAnnotation
static class ConfigWithSampleAnnotation {} static class ConfigWithSampleAnnotation {}
interface ReactivePersonRepository extends ReactiveCrudRepository<Person, String> {}
} }

3
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.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.context.annotation.ComponentScan.Filter; import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Import;
import org.springframework.data.repository.core.support.ReactiveDummyRepositoryFactoryBean; import org.springframework.data.repository.core.support.ReactiveDummyRepositoryFactoryBean;
@ -43,6 +44,8 @@ public @interface EnableReactiveRepositories {
Class<?> repositoryBaseClass() default ReactiveSortingRepository.class; Class<?> repositoryBaseClass() default ReactiveSortingRepository.class;
Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;
String namedQueriesLocation() default ""; String namedQueriesLocation() default "";
String repositoryImplementationPostfix() default "Impl"; String repositoryImplementationPostfix() default "Impl";

4
src/test/java/org/springframework/data/repository/config/RepositoryBeanDefinitionRegistrarSupportUnitTests.java

@ -77,7 +77,6 @@ class RepositoryBeanDefinitionRegistrarSupportUnitTests {
assertNoBeanDefinitionRegisteredFor("profileRepository"); assertNoBeanDefinitionRegisteredFor("profileRepository");
} }
@Test // GH-2584 @Test // GH-2584
void shouldExposeFragmentsAsBean() { void shouldExposeFragmentsAsBean() {
@ -202,7 +201,8 @@ class RepositoryBeanDefinitionRegistrarSupportUnitTests {
@EnableRepositories(basePackageClasses = MyNestedRepository.class, considerNestedRepositories = true, @EnableRepositories(basePackageClasses = MyNestedRepository.class, considerNestedRepositories = true,
excludeFilters = { excludeFilters = {
@Filter(type = FilterType.ASSIGNABLE_TYPE, @Filter(type = FilterType.ASSIGNABLE_TYPE,
value = RepositoryConfigurationExtensionSupportUnitTests.ReactiveRepository.class), value = { RepositoryConfigurationExtensionSupportUnitTests.ReactiveRepository.class,
AnnotationRepositoryConfigurationSourceUnitTests.ReactivePersonRepository.class }),
@Filter(type = FilterType.ASSIGNABLE_TYPE, value = MyOtherRepository.class) }) @Filter(type = FilterType.ASSIGNABLE_TYPE, value = MyOtherRepository.class) })
static class NestedRepositoriesConfiguration {} static class NestedRepositoriesConfiguration {}

Loading…
Cancel
Save