Skip to content

Commit f2608f6

Browse files
committed
More precise type information of factory bean definitions.
We now also forward the domain and identifier information detected on the repository to the target type declared for the repository factory bean definition. Fixes GH-3074.
1 parent 6f68df2 commit f2608f6

File tree

1 file changed

+23
-8
lines changed

1 file changed

+23
-8
lines changed

Diff for: src/main/java/org/springframework/data/repository/config/RepositoryConfigurationDelegate.java

+23-8
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.springframework.data.repository.config;
1717

18+
import java.lang.reflect.TypeVariable;
1819
import java.util.ArrayList;
1920
import java.util.Arrays;
2021
import java.util.Collection;
@@ -46,6 +47,8 @@
4647
import org.springframework.core.log.LogMessage;
4748
import org.springframework.core.metrics.ApplicationStartup;
4849
import org.springframework.core.metrics.StartupStep;
50+
import org.springframework.data.repository.core.RepositoryMetadata;
51+
import org.springframework.data.repository.core.support.AbstractRepositoryMetadata;
4952
import org.springframework.data.repository.core.support.RepositoryFactorySupport;
5053
import org.springframework.data.util.ReflectionUtils;
5154
import org.springframework.lang.Nullable;
@@ -182,7 +185,6 @@ public List<BeanComponentDefinition> registerRepositoriesIn(BeanDefinitionRegist
182185
}
183186

184187
RootBeanDefinition beanDefinition = (RootBeanDefinition) definitionBuilder.getBeanDefinition();
185-
186188
beanDefinition.setTargetType(getRepositoryInterface(configuration));
187189
beanDefinition.setResourceDescription(configuration.getResourceDescription());
188190

@@ -206,7 +208,7 @@ public List<BeanComponentDefinition> registerRepositoriesIn(BeanDefinitionRegist
206208

207209
if (logger.isInfoEnabled()) {
208210
logger.info(
209-
LogMessage.format("Finished Spring Data repository scanning in %s ms. Found %s %s repository interface%s." ,
211+
LogMessage.format("Finished Spring Data repository scanning in %s ms. Found %s %s repository interface%s.",
210212
watch.lastTaskInfo().getTimeMillis(), configurations.size(), extension.getModuleName(),
211213
configurations.size() == 1 ? "" : "s"));
212214
}
@@ -325,17 +327,30 @@ private ResolvableType getRepositoryInterface(RepositoryConfiguration<?> configu
325327
classLoader = classLoader != null ? classLoader : getClass().getClassLoader();
326328

327329
Class<?> repositoryInterface = ReflectionUtils.loadIfPresent(interfaceName, classLoader);
330+
331+
if (repositoryInterface == null) {
332+
return null;
333+
}
334+
328335
Class<?> factoryBean = ReflectionUtils.loadIfPresent(configuration.getRepositoryFactoryBeanClassName(),
329336
classLoader);
330337

331-
int numberOfGenerics = factoryBean.getTypeParameters().length;
338+
if (factoryBean == null) {
339+
return null;
340+
}
341+
342+
TypeVariable<?>[] variables = factoryBean.getTypeParameters();
343+
int numberOfGenerics = variables.length;
344+
RepositoryMetadata metadata = AbstractRepositoryMetadata.getMetadata(repositoryInterface);
332345

333-
Class<?>[] generics = new Class<?>[numberOfGenerics];
334-
generics[0] = repositoryInterface;
346+
ResolvableType[] generics = new ResolvableType[numberOfGenerics];
347+
generics[0] = ResolvableType.forClass(repositoryInterface);
348+
generics[1] = ResolvableType.forClass(metadata.getDomainType());
349+
generics[2] = ResolvableType.forClass(metadata.getIdType());
335350

336-
if (numberOfGenerics > 1) {
337-
for (int i = 1; i < numberOfGenerics; i++) {
338-
generics[i] = Object.class;
351+
if (numberOfGenerics > 3) {
352+
for (int i = 3; i < numberOfGenerics; i++) {
353+
generics[i] = ResolvableType.forType(variables[0]);
339354
}
340355
}
341356

0 commit comments

Comments
 (0)