From d98eeef745ec30130aba29b7ae867a4b65153a08 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Tue, 1 Aug 2023 22:40:12 +0200 Subject: [PATCH] Set FACTORY_BEAN_OBJECT_TYPE as Class in RepositoryConfigurationDelegate. This is to accommodate spring-projects/spring-framework#30917. --- .../RepositoryConfigurationDelegate.java | 21 ++++++++++++++++++- ...ositoryConfigurationDelegateUnitTests.java | 7 +++++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java index a603b37f01..8e3258338d 100644 --- a/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java +++ b/src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java @@ -47,8 +47,10 @@ import org.springframework.core.metrics.ApplicationStartup; import org.springframework.core.metrics.StartupStep; import org.springframework.data.repository.core.support.RepositoryFactorySupport; +import org.springframework.data.util.ReflectionUtils; import org.springframework.lang.Nullable; import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; import org.springframework.util.StopWatch; /** @@ -183,7 +185,7 @@ public List registerRepositoriesIn(BeanDefinitionRegist AbstractBeanDefinition beanDefinition = definitionBuilder.getBeanDefinition(); - beanDefinition.setAttribute(FACTORY_BEAN_OBJECT_TYPE, configuration.getRepositoryInterface()); + beanDefinition.setAttribute(FACTORY_BEAN_OBJECT_TYPE, getRepositoryInterface(configuration)); beanDefinition.setResourceDescription(configuration.getResourceDescription()); String beanName = configurationSource.generateBeanName(beanDefinition); @@ -307,6 +309,23 @@ private static ApplicationStartup getStartup(BeanDefinitionRegistry registry) { return ApplicationStartup.DEFAULT; } + /** + * Returns the repository interface of the given {@link RepositoryConfiguration} as loaded {@link Class}. + * + * @param configuration must not be {@literal null}. + * @return can be {@literal null}. + */ + @Nullable + private Class getRepositoryInterface(RepositoryConfiguration configuration) { + + String interfaceName = configuration.getRepositoryInterface(); + ClassLoader classLoader = resourceLoader.getClassLoader() == null + ? ClassUtils.getDefaultClassLoader() + : resourceLoader.getClassLoader(); + + return ReflectionUtils.loadIfPresent(interfaceName, classLoader); + } + /** * Customer {@link ContextAnnotationAutowireCandidateResolver} that also considers all injection points for lazy * repositories lazy. diff --git a/src/test/java/org/springframework/data/repository/config/RepositoryConfigurationDelegateUnitTests.java b/src/test/java/org/springframework/data/repository/config/RepositoryConfigurationDelegateUnitTests.java index 0b441719f3..5108ec0170 100644 --- a/src/test/java/org/springframework/data/repository/config/RepositoryConfigurationDelegateUnitTests.java +++ b/src/test/java/org/springframework/data/repository/config/RepositoryConfigurationDelegateUnitTests.java @@ -61,7 +61,7 @@ class RepositoryConfigurationDelegateUnitTests { RepositoryConfigurationExtension extension = new DummyConfigurationExtension(); - @Test // DATACMNS-892 + @Test // DATACMNS-892, #2891 void registersRepositoryBeanNameAsAttribute() { var environment = new StandardEnvironment(); @@ -76,8 +76,11 @@ void registersRepositoryBeanNameAsAttribute() { for (var definition : delegate.registerRepositoriesIn(context, extension)) { var beanDefinition = definition.getBeanDefinition(); + var attribute = beanDefinition.getAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE); - assertThat(beanDefinition.getAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE).toString()).endsWith("Repository"); + assertThat(attribute).isInstanceOfSatisfying(Class.class, it -> { + assertThat(it.getName()).endsWith("Repository"); + }); } }