From 1e5aad94cfcaad39b5eab009556c9cb39c005ab4 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Fri, 17 Nov 2017 10:12:39 +0100 Subject: [PATCH] DATACMNS-1215 - Fixed repository lookup for proxy domain classes. We now consistently use the user class for repository (metadata) lookup in Repositories. --- .../data/repository/support/Repositories.java | 8 ++++++-- .../support/RepositoriesUnitTests.java | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) 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 c4a2d17ed..efd8f7f42 100644 --- a/src/main/java/org/springframework/data/repository/support/Repositories.java +++ b/src/main/java/org/springframework/data/repository/support/Repositories.java @@ -122,7 +122,9 @@ public class Repositories implements Iterable> { Assert.notNull(domainClass, DOMAIN_TYPE_MUST_NOT_BE_NULL); - return repositoryFactoryInfos.containsKey(domainClass); + Class userClass = ClassUtils.getUserClass(domainClass); + + return repositoryFactoryInfos.containsKey(userClass); } /** @@ -135,7 +137,9 @@ public class Repositories implements Iterable> { Assert.notNull(domainClass, DOMAIN_TYPE_MUST_NOT_BE_NULL); - Optional repositoryBeanName = Optional.ofNullable(repositoryBeanNames.get(domainClass)); + Class userClass = ClassUtils.getUserClass(domainClass); + Optional repositoryBeanName = Optional.ofNullable(repositoryBeanNames.get(userClass)); + return beanFactory.flatMap(it -> repositoryBeanName.map(it::getBean)); } 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 bc708727c..1e2ccf338 100755 --- a/src/test/java/org/springframework/data/repository/support/RepositoriesUnitTests.java +++ b/src/test/java/org/springframework/data/repository/support/RepositoriesUnitTests.java @@ -29,6 +29,7 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.junit.MockitoJUnitRunner; +import org.springframework.aop.framework.ProxyFactory; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.DefaultListableBeanFactory; @@ -140,6 +141,23 @@ public class RepositoriesUnitTests { .hasValueSatisfying(it -> assertThat(it.getRepositoryInterface()).isEqualTo(PersonRepository.class)); } + @Test // DATACMNS-1215 + public void exposesRepositoryForProxyType() { + + ProxyFactory factory = new ProxyFactory(); + factory.setTarget(new Person()); + factory.setProxyTargetClass(true); + + Object proxy = factory.getProxy(); + + assertThat(ClassUtils.isCglibProxy(proxy)).isTrue(); + + Repositories repositories = new Repositories(context); + + assertThat(repositories.hasRepositoryFor(proxy.getClass())).isTrue(); + assertThat(repositories.getRepositoryFor(proxy.getClass())).isNotEmpty(); + } + class Person {} class Address {}