diff --git a/spring-data-commons-core/src/main/java/org/springframework/data/repository/support/DomainClassConverter.java b/spring-data-commons-core/src/main/java/org/springframework/data/repository/support/DomainClassConverter.java index df932e11f..c1d3a2d9d 100644 --- a/spring-data-commons-core/src/main/java/org/springframework/data/repository/support/DomainClassConverter.java +++ b/spring-data-commons-core/src/main/java/org/springframework/data/repository/support/DomainClassConverter.java @@ -113,7 +113,8 @@ public class DomainClassConverter metadata = entry.getEntityInformation(); Class> objectType = entry.getRepositoryInterface(); - CrudRepository repository = BeanFactoryUtils.beanOfType(context, objectType); + CrudRepository repository = BeanFactoryUtils.beanOfTypeIncludingAncestors(context, + objectType); this.repositories.put(metadata, repository); } diff --git a/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DomainClassConverterUnitTests.java b/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DomainClassConverterUnitTests.java index 74c651ba4..0ff2c6595 100644 --- a/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DomainClassConverterUnitTests.java +++ b/spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DomainClassConverterUnitTests.java @@ -57,7 +57,7 @@ public class DomainClassConverterUnitTests { Map providers; @Mock - ApplicationContext context; + ApplicationContext context, parent; @Mock UserRepository repository; @Mock @@ -77,9 +77,6 @@ public class DomainClassConverterUnitTests { sourceDescriptor = TypeDescriptor.valueOf(String.class); targetDescriptor = TypeDescriptor.valueOf(User.class); - Map map = getBeanAsMap(repository); - when(context.getBeansOfType(UserRepository.class)).thenReturn(map); - when(context.getBeansOfType(RepositoryFactoryInformation.class)).thenReturn(providers); when(provider.getEntityInformation()).thenReturn(information); when(provider.getRepositoryInterface()).thenReturn((Class) UserRepository.class); when(information.getJavaType()).thenReturn(User.class); @@ -96,7 +93,7 @@ public class DomainClassConverterUnitTests { @Test public void matchesIfConversionInBetweenIsPossible() throws Exception { - letContextContain(provider); + letContextContain(context, provider); converter.setApplicationContext(context); when(service.canConvert(String.class, Long.class)).thenReturn(true); @@ -107,7 +104,7 @@ public class DomainClassConverterUnitTests { @Test public void matchFailsIfNoIntermediateConversionIsPossible() throws Exception { - letContextContain(provider); + letContextContain(context, provider); converter.setApplicationContext(context); when(service.canConvert(String.class, Long.class)).thenReturn(false); @@ -123,7 +120,7 @@ public class DomainClassConverterUnitTests { @Test public void convertsStringToUserCorrectly() throws Exception { - letContextContain(provider); + letContextContain(context, provider); converter.setApplicationContext(context); when(service.canConvert(String.class, Long.class)).thenReturn(true); @@ -135,12 +132,38 @@ public class DomainClassConverterUnitTests { assertThat(user, is((Object) USER)); } - private void letContextContain(Object bean) { + /** + * @see DATACMNS-133 + */ + @Test + public void discoversFactoryAndRepoFromParentApplicationContext() { + + letContextContain(parent, provider); + when(context.getParentBeanFactory()).thenReturn(parent); + when(service.canConvert(String.class, Long.class)).thenReturn(true); + + converter.setApplicationContext(context); + assertThat(converter.matches(sourceDescriptor, targetDescriptor), is(true)); + } + + private void letContextContain(ApplicationContext context, Object bean) { + + configureContextToReturnBeans(context, repository, provider); Map beanMap = getBeanAsMap(bean); when(context.getBeansOfType(argThat(is(subtypeOf(bean.getClass()))))).thenReturn(beanMap); } + private void configureContextToReturnBeans(ApplicationContext context, UserRepository repository, + RepositoryFactoryInformation provider) { + + Map map = getBeanAsMap(repository); + when(context.getBeansOfType(UserRepository.class)).thenReturn(map); + + providers.put("provider", provider); + when(context.getBeansOfType(RepositoryFactoryInformation.class)).thenReturn(providers); + } + private Map getBeanAsMap(T bean) { Map beanMap = new HashMap();