diff --git a/src/main/java/org/springframework/data/repository/support/Repositories.java b/src/main/java/org/springframework/data/repository/support/Repositories.java index 3d73e8e2f4..35326373f6 100644 --- a/src/main/java/org/springframework/data/repository/support/Repositories.java +++ b/src/main/java/org/springframework/data/repository/support/Repositories.java @@ -29,6 +29,7 @@ import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.data.mapping.PersistentEntity; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.repository.core.EntityInformation; @@ -46,6 +47,7 @@ * @author Thomas Darimont * @author Thomas Eizinger * @author Christoph Strobl + * @author Jan Zeppenfeld */ public class Repositories implements Iterable> { @@ -276,9 +278,16 @@ private void cacheFirstOrPrimary(Class type, RepositoryFactoryInformation inf if (repositoryBeanNames.containsKey(type)) { - Boolean presentAndPrimary = beanFactory // + ConfigurableListableBeanFactory configurableListableBeanFactory = beanFactory .filter(ConfigurableListableBeanFactory.class::isInstance) // .map(ConfigurableListableBeanFactory.class::cast) // + .orElse(beanFactory // + .filter(ConfigurableApplicationContext.class::isInstance) // + .map(ConfigurableApplicationContext.class::cast) // + .map(ConfigurableApplicationContext::getBeanFactory) // + .orElse(null)); + + Boolean presentAndPrimary = Optional.ofNullable(configurableListableBeanFactory) .map(it -> it.getBeanDefinition(name)) // .map(BeanDefinition::isPrimary) // .orElse(false); diff --git a/src/test/java/org/springframework/data/repository/support/RepositoriesUnitTests.java b/src/test/java/org/springframework/data/repository/support/RepositoriesUnitTests.java index 71a7a4b54f..b7a5f2b886 100755 --- a/src/test/java/org/springframework/data/repository/support/RepositoriesUnitTests.java +++ b/src/test/java/org/springframework/data/repository/support/RepositoriesUnitTests.java @@ -56,6 +56,7 @@ * * @author Oliver Gierke * @author Thomas Darimont + * @author Jan Zeppenfeld */ @ExtendWith(MockitoExtension.class) @MockitoSettings(strictness = Strictness.LENIENT) @@ -183,6 +184,28 @@ void keepsPrimaryRepositoryInCaseOfMultipleOnes() { }); } + @Test // DATAREST-923, DATACMNS-1142 + void keepsPrimaryRepositoryInCaseOfMultipleOnesIfContextIsNotAConfigurableListableBeanFactory() { + + DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); + beanFactory.registerBeanDefinition("first", getRepositoryBeanDefinition(FirstRepository.class)); + + AbstractBeanDefinition definition = getRepositoryBeanDefinition(PrimaryRepository.class); + definition.setPrimary(true); + + beanFactory.registerBeanDefinition("primary", definition); + beanFactory.registerBeanDefinition("third", getRepositoryBeanDefinition(ThirdRepository.class)); + + context = new GenericApplicationContext(beanFactory); + context.refresh(); + + Repositories repositories = new Repositories(context); + + assertThat(repositories.getRepositoryFor(SomeEntity.class)).hasValueSatisfying(it -> { + assertThat(it).isInstanceOf(PrimaryRepository.class); + }); + } + class Person {} class Address {}