Browse Source

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.
pull/14/head
Oliver Gierke 14 years ago
parent
commit
2f39b74cbc
  1. 3
      spring-data-commons-core/src/main/java/org/springframework/data/repository/support/DomainClassConverter.java
  2. 39
      spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DomainClassConverterUnitTests.java

3
spring-data-commons-core/src/main/java/org/springframework/data/repository/support/DomainClassConverter.java

@ -113,7 +113,8 @@ public class DomainClassConverter<T extends ConversionService & ConverterRegistr
EntityInformation<Object, Serializable> metadata = entry.getEntityInformation(); EntityInformation<Object, Serializable> metadata = entry.getEntityInformation();
Class<CrudRepository<Object, Serializable>> objectType = entry.getRepositoryInterface(); Class<CrudRepository<Object, Serializable>> objectType = entry.getRepositoryInterface();
CrudRepository<Object, Serializable> repository = BeanFactoryUtils.beanOfType(context, objectType); CrudRepository<Object, Serializable> repository = BeanFactoryUtils.beanOfTypeIncludingAncestors(context,
objectType);
this.repositories.put(metadata, repository); this.repositories.put(metadata, repository);
} }

39
spring-data-commons-core/src/test/java/org/springframework/data/repository/support/DomainClassConverterUnitTests.java

@ -57,7 +57,7 @@ public class DomainClassConverterUnitTests {
Map<String, RepositoryFactoryInformation> providers; Map<String, RepositoryFactoryInformation> providers;
@Mock @Mock
ApplicationContext context; ApplicationContext context, parent;
@Mock @Mock
UserRepository repository; UserRepository repository;
@Mock @Mock
@ -77,9 +77,6 @@ public class DomainClassConverterUnitTests {
sourceDescriptor = TypeDescriptor.valueOf(String.class); sourceDescriptor = TypeDescriptor.valueOf(String.class);
targetDescriptor = TypeDescriptor.valueOf(User.class); targetDescriptor = TypeDescriptor.valueOf(User.class);
Map<String, UserRepository> map = getBeanAsMap(repository);
when(context.getBeansOfType(UserRepository.class)).thenReturn(map);
when(context.getBeansOfType(RepositoryFactoryInformation.class)).thenReturn(providers);
when(provider.getEntityInformation()).thenReturn(information); when(provider.getEntityInformation()).thenReturn(information);
when(provider.getRepositoryInterface()).thenReturn((Class) UserRepository.class); when(provider.getRepositoryInterface()).thenReturn((Class) UserRepository.class);
when(information.getJavaType()).thenReturn(User.class); when(information.getJavaType()).thenReturn(User.class);
@ -96,7 +93,7 @@ public class DomainClassConverterUnitTests {
@Test @Test
public void matchesIfConversionInBetweenIsPossible() throws Exception { public void matchesIfConversionInBetweenIsPossible() throws Exception {
letContextContain(provider); letContextContain(context, provider);
converter.setApplicationContext(context); converter.setApplicationContext(context);
when(service.canConvert(String.class, Long.class)).thenReturn(true); when(service.canConvert(String.class, Long.class)).thenReturn(true);
@ -107,7 +104,7 @@ public class DomainClassConverterUnitTests {
@Test @Test
public void matchFailsIfNoIntermediateConversionIsPossible() throws Exception { public void matchFailsIfNoIntermediateConversionIsPossible() throws Exception {
letContextContain(provider); letContextContain(context, provider);
converter.setApplicationContext(context); converter.setApplicationContext(context);
when(service.canConvert(String.class, Long.class)).thenReturn(false); when(service.canConvert(String.class, Long.class)).thenReturn(false);
@ -123,7 +120,7 @@ public class DomainClassConverterUnitTests {
@Test @Test
public void convertsStringToUserCorrectly() throws Exception { public void convertsStringToUserCorrectly() throws Exception {
letContextContain(provider); letContextContain(context, provider);
converter.setApplicationContext(context); converter.setApplicationContext(context);
when(service.canConvert(String.class, Long.class)).thenReturn(true); when(service.canConvert(String.class, Long.class)).thenReturn(true);
@ -135,12 +132,38 @@ public class DomainClassConverterUnitTests {
assertThat(user, is((Object) USER)); 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<String, Object> beanMap = getBeanAsMap(bean); Map<String, Object> beanMap = getBeanAsMap(bean);
when(context.getBeansOfType(argThat(is(subtypeOf(bean.getClass()))))).thenReturn(beanMap); when(context.getBeansOfType(argThat(is(subtypeOf(bean.getClass()))))).thenReturn(beanMap);
} }
private void configureContextToReturnBeans(ApplicationContext context, UserRepository repository,
RepositoryFactoryInformation<User, Long> provider) {
Map<String, UserRepository> map = getBeanAsMap(repository);
when(context.getBeansOfType(UserRepository.class)).thenReturn(map);
providers.put("provider", provider);
when(context.getBeansOfType(RepositoryFactoryInformation.class)).thenReturn(providers);
}
private <T> Map<String, T> getBeanAsMap(T bean) { private <T> Map<String, T> getBeanAsMap(T bean) {
Map<String, T> beanMap = new HashMap<String, T>(); Map<String, T> beanMap = new HashMap<String, T>();

Loading…
Cancel
Save