From 2f39b74cbc30a36897c65b65a3174bb42fb60bcd Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 20 Mar 2012 11:03:51 +0100 Subject: [PATCH] DATACMNS-133 - Fixed bean lookup in DomainClassConverter. Previously DomainClassConverter looked up the RepositoryInformation instances from the entire BeanFactory hierarchy but only looked the actual repository up from the current BeanFactory and not the entire hierarchy. Fixed and added test case. --- .../support/DomainClassConverter.java | 3 +- .../DomainClassConverterUnitTests.java | 39 +++++++++++++++---- 2 files changed, 33 insertions(+), 9 deletions(-) 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();